diff options
author | FizzyElt | 2025-02-01 00:08:04 +0800 |
---|---|---|
committer | FizzyElt | 2025-02-01 00:08:04 +0800 |
commit | 3406d6bc2f7badd5af85bf7b928fa21fbe4828dd (patch) | |
tree | 56020023fd0b04dee88a8b4619473af4390c0ce3 | |
parent | bf0fa34b9e41e579ad524792af1d305177ba830d (diff) |
lambda core with ocaml
-rw-r--r-- | languages/o/ocaml/.ocamlformat | 1 | ||||
-rw-r--r-- | languages/o/ocaml/README.md | 9 | ||||
-rw-r--r-- | languages/o/ocaml/lambda_core.ml | 51 |
3 files changed, 61 insertions, 0 deletions
diff --git a/languages/o/ocaml/.ocamlformat b/languages/o/ocaml/.ocamlformat new file mode 100644 index 0000000..3b21763 --- /dev/null +++ b/languages/o/ocaml/.ocamlformat @@ -0,0 +1 @@ +profile=janestreet diff --git a/languages/o/ocaml/README.md b/languages/o/ocaml/README.md new file mode 100644 index 0000000..ef84e0e --- /dev/null +++ b/languages/o/ocaml/README.md @@ -0,0 +1,9 @@ +Download OCaml version 5 or above + +```shell +# build +ocamlc -o lambda_core lambda_core.ml + +# run +./lambda_core +```
\ No newline at end of file diff --git a/languages/o/ocaml/lambda_core.ml b/languages/o/ocaml/lambda_core.ml new file mode 100644 index 0000000..54e036c --- /dev/null +++ b/languages/o/ocaml/lambda_core.ml @@ -0,0 +1,51 @@ +(* LOGIC *) +let _true = fun x -> fun _y -> x +let _false = fun _x -> fun y -> y +let _not = fun b -> b _false _true +let _and = fun b1 -> fun b2 -> b1 b2 _false +let _or = fun b1 -> fun b2 -> b1 _true b2 + +(* CHURCH NUMERALS *) +let _zero = fun _f -> fun x -> x +let _succ = fun n -> fun f -> fun x -> f (n f x) + +let _pred = + fun n -> fun f -> fun x -> n (fun g -> fun h -> h (g f)) (fun _u -> x) (fun a -> a) +;; + +let _one = _succ _zero +let read_bool = fun b -> b "true" "false" |> print_endline +let read_church = fun n -> n (fun x -> x + 1) 0 |> string_of_int |> print_endline + +let () = + (* EXAMPLE *) + print_endline "LOGIC"; + print_endline "----------------"; + print_endline "TRUE/FALSE"; + read_bool _true; + read_bool _false; + print_endline "NOT"; + read_bool (_not _true); + read_bool (_not _false); + print_endline "AND"; + read_bool (_and _true _true); + read_bool (_and _true _false); + read_bool (_and _false _true); + read_bool (_and _false _false); + print_endline "OR"; + read_bool (_or _true _true); + read_bool (_or _true _false); + read_bool (_or _false _true); + read_bool (_or _false _false); + print_endline "\nCHURCH NUMERALS"; + print_endline "----------------"; + print_endline "ZERO/SUCC"; + read_church _zero; + read_church _one; + read_church (_succ _one); + read_church (_succ (_succ _one)); + print_endline "PRED"; + read_church (_pred (_succ _zero)); + read_church (_pred (_succ (_succ _zero))); + read_church (_pred (_succ (_succ (_succ _zero)))) +;; |