Data update
This commit is contained in:
parent
ed705008a8
commit
0df55f9f24
2196 changed files with 32999 additions and 3075 deletions
93
Task/Church-numerals/FreeBASIC/church-numerals.basic
Normal file
93
Task/Church-numerals/FreeBASIC/church-numerals.basic
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
Type church
|
||||
' eg {r_add,1,{a,b}}
|
||||
op As Integer
|
||||
n As Integer
|
||||
x(1 To 2) As Integer
|
||||
End Type
|
||||
|
||||
Dim Shared As church zero = Type<church>(1, 0, {0, 1})
|
||||
|
||||
Function succ(c As church) As church
|
||||
' eg {r_add,1,{a,b}} => {r_add,2,{a,b}} aka a+b -> a+b+b
|
||||
c.n += 1
|
||||
Return c
|
||||
End Function
|
||||
|
||||
' three normal integer-handling routines...
|
||||
Function sum(n As Integer, a As Integer, b As Integer) As Integer
|
||||
For i As Integer = 1 To n
|
||||
a += b
|
||||
Next i
|
||||
Return a
|
||||
End Function
|
||||
|
||||
Function mul(n As Integer, a As Integer, b As Integer) As Integer
|
||||
For i As Integer = 1 To n
|
||||
a *= b
|
||||
Next i
|
||||
Return a
|
||||
End Function
|
||||
|
||||
Function pow(n As Integer, a As Integer, b As Integer) As Integer
|
||||
For i As Integer = 1 To n
|
||||
a = a ^ b
|
||||
Next i
|
||||
Return a
|
||||
End Function
|
||||
|
||||
' ...and three church constructors to match
|
||||
' (no maths here, just pure static data)
|
||||
Function churchSum(c As church, d As church) As church
|
||||
Dim res As church
|
||||
res.op = 1 ' 1 for add
|
||||
res.n = 1
|
||||
res.x(1) = c.n
|
||||
res.x(2) = d.n
|
||||
Return res
|
||||
End Function
|
||||
|
||||
Function churchMul(c As church, d As church) As church
|
||||
Dim res As church
|
||||
res.op = 2 ' 2 for mul
|
||||
res.n = 1
|
||||
res.x(1) = c.n
|
||||
res.x(2) = d.n
|
||||
Return res
|
||||
End Function
|
||||
|
||||
Function churchPow(c As church, d As church) As church
|
||||
Dim res As church
|
||||
res.op = 3 ' 3 for pow
|
||||
res.n = 1
|
||||
res.x(1) = c.n
|
||||
res.x(2) = d.n
|
||||
Return res
|
||||
End Function
|
||||
|
||||
Function churchToNum(c As church) As Integer
|
||||
' note this is where the bulk of any processing happens
|
||||
Select Case c.op
|
||||
Case 1
|
||||
Return sum(c.n, c.x(1), c.x(2))
|
||||
Case 2
|
||||
Return mul(c.n, c.x(1), c.x(2))
|
||||
Case 3
|
||||
Return pow(c.n, c.x(1), c.x(2))
|
||||
End Select
|
||||
End Function
|
||||
|
||||
Function numToChurch(i As Integer) As church
|
||||
Return Iif(i = 0, zero, succ(numToChurch(i - 1)))
|
||||
End Function
|
||||
|
||||
Dim As church three = succ(succ(succ(zero)))
|
||||
Dim As church four = succ(three)
|
||||
Print "three -> "; churchToNum(three)
|
||||
Print "four -> "; churchToNum(four)
|
||||
Print "three + four -> "; churchToNum(churchSum(three, four))
|
||||
Print "three * four -> "; churchToNum(churchMul(three, four))
|
||||
Print "three ^ four -> "; churchToNum(churchPow(three, four))
|
||||
Print "four ^ three -> "; churchToNum(churchPow(four, three))
|
||||
Print "5 -> five -> "; churchToNum(numToChurch(5))
|
||||
|
||||
Sleep
|
||||
41
Task/Church-numerals/Scala/church-numerals.scala
Normal file
41
Task/Church-numerals/Scala/church-numerals.scala
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
object Church {
|
||||
|
||||
trait ChurchNum extends (ChurchNum => ChurchNum)
|
||||
|
||||
def zero: ChurchNum = f => x => x
|
||||
|
||||
def next(n: ChurchNum): ChurchNum = f => x => f(n(f)(x))
|
||||
|
||||
def plus(a: ChurchNum)(b: ChurchNum): ChurchNum = f => x => b(f)(a(f)(x))
|
||||
|
||||
def mult(a: ChurchNum)(b: ChurchNum): ChurchNum = f => x => b(a(f))(x)
|
||||
|
||||
def pow(m: ChurchNum)(n: ChurchNum): ChurchNum = n(m)
|
||||
|
||||
def toChurchNum(n: Int): ChurchNum = if (n <= 0) zero else next(toChurchNum(n - 1))
|
||||
|
||||
def toInt(c: ChurchNum): Int = {
|
||||
var counter = 0
|
||||
val funCounter: ChurchNum = f => { counter += 1; f }
|
||||
plus(zero)(c)(funCounter)(x => x)
|
||||
counter
|
||||
}
|
||||
|
||||
def main(args: Array[String]): Unit = {
|
||||
val zero = Church.zero
|
||||
val three = next(next(next(zero)))
|
||||
val four = next(next(next(next(zero))))
|
||||
|
||||
println(s"3+4=${toInt(plus(three)(four))}") // prints 7
|
||||
println(s"4+3=${toInt(plus(four)(three))}") // prints 7
|
||||
|
||||
println(s"3*4=${toInt(mult(three)(four))}") // prints 12
|
||||
println(s"4*3=${toInt(mult(four)(three))}") // prints 12
|
||||
|
||||
// exponentiation. note the reversed order!
|
||||
println(s"3^4=${toInt(pow(four)(three))}") // prints 81
|
||||
println(s"4^3=${toInt(pow(three)(four))}") // prints 64
|
||||
|
||||
println(s" 8=${toInt(toChurchNum(8))}") // prints 8
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue