aboutsummaryrefslogtreecommitdiff
path: root/languages/j/javascript/lambda-core.js
blob: 5b4d7c91545a447ae159248a2efa6635e66e9ea6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// LOGIC
const _true = x => y => x;
const _false = x => y => y;
const _not = b => b(_false)(_true)
const _and = b1 => b2 => b1(b2)(_false)
const _or = b1 => b2 => b1(_true)(b2)

// CHURCH NUMERALS
const _zero = f => x => x;
const _succ = n => f => x => f(n(f)(x))
const _pred = n => f => x => n(g => h => h(g(f)))(u => x)(a => a)
const _one = _succ(_zero)

// HELPERS - not pure lambda calculus
const readBool = b => console.log(b("t")("f"))
const readChurch = n => console.log(n(x => x+1)(0))

// -------------------------------------------------

// EXAMPLES
console.log("LOGIC")
console.log("---------------")
console.log("TRUE/FALSE")
readBool(_true) // t
readBool(_false) // f

console.log("NOT")
readBool(_not(_true)) // f
readBool(_not(_false)) // t

console.log("AND")
readBool(_and(_true)(_true)) // t
readBool(_and(_true)(_false)) // f
readBool(_and(_false)(_true)) // f
readBool(_and(_false)(_false)) // f

console.log("OR")
readBool(_or(_true)(_true)) // t
readBool(_or(_true)(_false)) // t
readBool(_or(_false)(_true)) // t
readBool(_or(_false)(_false)) // f

console.log("\nCHURCH NUMERALS")
console.log("---------------")
console.log("ZERO/SUCC")
readChurch(_zero) // 0
readChurch(_one) // 1
readChurch(_succ(_one)) // 2
readChurch(_succ(_succ(_one))) // 3

console.log("PRED")
readChurch(_pred(_one)) // 0
readChurch(_pred(_succ(_one))) // 1
readChurch(_pred(_succ(_succ(_one)))) // 2