aboutsummaryrefslogtreecommitdiff
path: root/languages/o/ocaml/lambda_core.ml
blob: 54e036c8f3ccf1209fc1c3e22ff5cf720683aeea (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
(* 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))))
;;