diff options
Diffstat (limited to 'languages/j/javascript/lambda-core.js')
-rw-r--r-- | languages/j/javascript/lambda-core.js | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/languages/j/javascript/lambda-core.js b/languages/j/javascript/lambda-core.js new file mode 100644 index 0000000..5b4d7c9 --- /dev/null +++ b/languages/j/javascript/lambda-core.js @@ -0,0 +1,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 + |