216 lines
6.8 KiB
OCaml
216 lines
6.8 KiB
OCaml
|
|
open Lang.MiniFun
|
||
|
|
|
||
|
|
(* -------------------------------------------------------------------------- *)
|
||
|
|
(* Identity program *)
|
||
|
|
let program =
|
||
|
|
Function
|
||
|
|
(["a"],
|
||
|
|
FunctionType ([IntegerType], IntegerType),
|
||
|
|
(Variable "a")
|
||
|
|
)
|
||
|
|
;;
|
||
|
|
|
||
|
|
Printf.printf "Identity program: %b\n" (typecheck program)
|
||
|
|
|
||
|
|
(* -------------------------------------------------------------------------- *)
|
||
|
|
(* Constant program *)
|
||
|
|
let program =
|
||
|
|
Function
|
||
|
|
(["a"],
|
||
|
|
FunctionType ([IntegerType], IntegerType),
|
||
|
|
(Integer 1)
|
||
|
|
)
|
||
|
|
;;
|
||
|
|
|
||
|
|
Printf.printf "Constant program: %b\n" (typecheck program)
|
||
|
|
|
||
|
|
(* -------------------------------------------------------------------------- *)
|
||
|
|
(* Partial application of function program *)
|
||
|
|
let program =
|
||
|
|
LetIn
|
||
|
|
("f",
|
||
|
|
(Function (["x"; "y"],
|
||
|
|
FunctionType ([IntegerType; IntegerType], IntegerType),
|
||
|
|
Plus (Variable "x", Variable "y"))),
|
||
|
|
(Application (Variable "f", [Integer 3]))
|
||
|
|
)
|
||
|
|
;;
|
||
|
|
|
||
|
|
Printf.printf "Partial application of function program: %b\n" (typecheck program)
|
||
|
|
|
||
|
|
(* -------------------------------------------------------------------------- *)
|
||
|
|
(* Partial application of function program *)
|
||
|
|
let program =
|
||
|
|
LetFun
|
||
|
|
("f",
|
||
|
|
["x"],
|
||
|
|
FunctionType ([IntegerType], FunctionType ([IntegerType], IntegerType)),
|
||
|
|
(Function (["y"],
|
||
|
|
FunctionType ([IntegerType], IntegerType),
|
||
|
|
Plus (Variable "x", Variable "y"))),
|
||
|
|
(Application (Variable "f", [Integer 3]))
|
||
|
|
)
|
||
|
|
;;
|
||
|
|
|
||
|
|
Printf.printf "Partial application of function program: %b\n" (typecheck program)
|
||
|
|
|
||
|
|
(* -------------------------------------------------------------------------- *)
|
||
|
|
(* Passing functions to functions program *)
|
||
|
|
let program =
|
||
|
|
LetIn
|
||
|
|
("f",
|
||
|
|
(Function (
|
||
|
|
["z"],
|
||
|
|
FunctionType ([FunctionType ([IntegerType], IntegerType)], FunctionType ([FunctionType ([IntegerType], IntegerType)], FunctionType ([IntegerType], IntegerType))),
|
||
|
|
(Function (
|
||
|
|
["y"],
|
||
|
|
FunctionType ([FunctionType ([IntegerType], IntegerType)], FunctionType ([IntegerType], IntegerType)),
|
||
|
|
Function (
|
||
|
|
["x"],
|
||
|
|
FunctionType ([IntegerType], IntegerType),
|
||
|
|
(IfThenElse (
|
||
|
|
CmpLess (Variable "x", Integer 0),
|
||
|
|
(Application (Variable "y", [Variable "x"])),
|
||
|
|
(Application (Variable "z", [Variable "x"]))
|
||
|
|
)))
|
||
|
|
))
|
||
|
|
)),
|
||
|
|
(Application
|
||
|
|
(
|
||
|
|
(Application
|
||
|
|
(Variable "f",
|
||
|
|
[Function (["x"], FunctionType ([IntegerType], IntegerType), Plus (Variable "x", Integer 1))]
|
||
|
|
)
|
||
|
|
),
|
||
|
|
[Function (["x"], FunctionType ([IntegerType], IntegerType), Minus (Variable "x", Integer 1))]
|
||
|
|
)
|
||
|
|
)
|
||
|
|
)
|
||
|
|
;;
|
||
|
|
|
||
|
|
Printf.printf "Passing functions to functions program: %b\n" (typecheck program)
|
||
|
|
|
||
|
|
(* -------------------------------------------------------------------------- *)
|
||
|
|
(* Recursive function program *)
|
||
|
|
let program =
|
||
|
|
LetFun
|
||
|
|
("f",
|
||
|
|
["x"],
|
||
|
|
FunctionType ([IntegerType], IntegerType),
|
||
|
|
(IfThenElse (CmpLess (Variable "x", Integer 2),Integer 1, Plus (Variable "x", Application (Variable "f", [Minus (Variable "x", Integer 1)])))),
|
||
|
|
(Variable "f")
|
||
|
|
)
|
||
|
|
;;
|
||
|
|
|
||
|
|
Printf.printf "Recursive function program: %b\n" (typecheck program)
|
||
|
|
|
||
|
|
(* -------------------------------------------------------------------------- *)
|
||
|
|
(* Scope program *)
|
||
|
|
let program =
|
||
|
|
LetIn
|
||
|
|
("f",
|
||
|
|
(LetIn ("a", Integer 1, (Function (["y"], FunctionType ([IntegerType], IntegerType), Plus (Variable "y", Variable "a"))))),
|
||
|
|
(LetIn ("a", Integer 2, Variable "f"))
|
||
|
|
)
|
||
|
|
;;
|
||
|
|
|
||
|
|
Printf.printf "Scope program: %b\n" (typecheck program)
|
||
|
|
|
||
|
|
(* -------------------------------------------------------------------------- *)
|
||
|
|
(* Factorial program *)
|
||
|
|
let program =
|
||
|
|
LetFun (
|
||
|
|
"f",
|
||
|
|
["x"],
|
||
|
|
FunctionType ([IntegerType], IntegerType),
|
||
|
|
(IfThenElse (CmpLessEq (Variable "x", Integer 0), Integer 1, Times (Variable "x", Application (Variable "f", [Minus (Variable "x", Integer 1)])))),
|
||
|
|
(Variable "f")
|
||
|
|
)
|
||
|
|
;;
|
||
|
|
|
||
|
|
Printf.printf "Factorial program: %b\n" (typecheck program)
|
||
|
|
;;
|
||
|
|
|
||
|
|
(* -------------------------------------------------------------------------- *)
|
||
|
|
(* Hailstone sequence's lenght program *)
|
||
|
|
|
||
|
|
let program =
|
||
|
|
LetFun (
|
||
|
|
"collatz",
|
||
|
|
["n"; "count"],
|
||
|
|
FunctionType ([IntegerType; IntegerType], IntegerType),
|
||
|
|
(
|
||
|
|
IfThenElse (BNot (Cmp (Variable "n", Integer 1)),
|
||
|
|
(IfThenElse (Cmp (Modulo (Variable "n", Integer 2), Integer 0),
|
||
|
|
Application (Variable "collatz", [Division (Variable "n", Integer 2); Plus (Integer 1, Variable "count")]),
|
||
|
|
Application (Variable "collatz", [(Plus (Integer 1, Times (Integer 3, Variable "n"))); Plus (Integer 1, Variable "count")]))),
|
||
|
|
(Variable "count"))
|
||
|
|
),
|
||
|
|
(Function (["x"],
|
||
|
|
FunctionType ([IntegerType], IntegerType),
|
||
|
|
Application (Variable "collatz", [Variable "x"; Integer 1])))
|
||
|
|
)
|
||
|
|
;;
|
||
|
|
|
||
|
|
Printf.printf "Hailstone sequence's lenght program: %b\n" (typecheck program)
|
||
|
|
;;
|
||
|
|
|
||
|
|
(* -------------------------------------------------------------------------- *)
|
||
|
|
(* Sum multiples of 3 and 5 program *)
|
||
|
|
|
||
|
|
let program =
|
||
|
|
LetFun (
|
||
|
|
"sum",
|
||
|
|
["n"],
|
||
|
|
FunctionType ([IntegerType], IntegerType),
|
||
|
|
(IfThenElse ((BOr (Cmp (Modulo (Variable "n", Integer 3), Integer 0), Cmp (Modulo (Variable "n", Integer 5), Integer 0))),
|
||
|
|
Plus (Variable "n", Application (Variable "sum", [Minus (Variable "n", Integer 1)])),
|
||
|
|
(IfThenElse ((CmpLessEq (Variable "n", Integer 1)),
|
||
|
|
(Integer 0),
|
||
|
|
(Application (Variable "sum", [Minus (Variable "n", Integer 1)])))
|
||
|
|
))
|
||
|
|
),
|
||
|
|
(Variable "sum")
|
||
|
|
)
|
||
|
|
;;
|
||
|
|
|
||
|
|
Printf.printf "Sum multiples of 3 and 5 program: %b\n" (typecheck program)
|
||
|
|
;;
|
||
|
|
|
||
|
|
(* -------------------------------------------------------------------------- *)
|
||
|
|
(* Rand program *)
|
||
|
|
let program =
|
||
|
|
Function (
|
||
|
|
["x"],
|
||
|
|
FunctionType ([IntegerType], IntegerType),
|
||
|
|
Rand (Variable "x")
|
||
|
|
)
|
||
|
|
|
||
|
|
;;
|
||
|
|
|
||
|
|
Printf.printf "Rand program: %b\n" (typecheck program)
|
||
|
|
;;
|
||
|
|
|
||
|
|
(* -------------------------------------------------------------------------- *)
|
||
|
|
(* Fibonacci program *)
|
||
|
|
let program =
|
||
|
|
LetFun (
|
||
|
|
"fib",
|
||
|
|
["i"; "a"; "b"],
|
||
|
|
FunctionType ([IntegerType; IntegerType; IntegerType], IntegerType),
|
||
|
|
(IfThenElse (Cmp (Variable "i", Integer 0),
|
||
|
|
Variable "a",
|
||
|
|
Application (Variable "fib", [Minus (Variable "i", Integer 1);
|
||
|
|
Variable "b";
|
||
|
|
Plus (Variable "a", Variable "b")])
|
||
|
|
)),
|
||
|
|
Function (["x"],
|
||
|
|
FunctionType ([IntegerType], IntegerType),
|
||
|
|
(Application (Variable "fib", [Variable "x"; Integer 0; Integer 1])))
|
||
|
|
)
|
||
|
|
|
||
|
|
;;
|
||
|
|
|
||
|
|
Printf.printf "Fibonacci program: %b\n" (typecheck program)
|
||
|
|
;;
|