aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFizzyElt2025-02-01 00:08:04 +0800
committerFizzyElt2025-02-01 00:08:04 +0800
commit3406d6bc2f7badd5af85bf7b928fa21fbe4828dd (patch)
tree56020023fd0b04dee88a8b4619473af4390c0ce3
parentbf0fa34b9e41e579ad524792af1d305177ba830d (diff)
lambda core with ocaml
-rw-r--r--languages/o/ocaml/.ocamlformat1
-rw-r--r--languages/o/ocaml/README.md9
-rw-r--r--languages/o/ocaml/lambda_core.ml51
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))))
+;;