79 lines
2.3 KiB
Standard ML
79 lines
2.3 KiB
Standard ML
open LambdaCal
|
|
(* 1. Can we implement recursion in terms of shift and reduce? Re recursion is an effect *)
|
|
|
|
(* The term i want to define is:
|
|
fix (\sum. (\x. if x = 0 then 0 else sum (x - 1)))
|
|
|
|
Let us create the nameless representation
|
|
fix (\. (\. if $0 = 0 then 0 else $0 + $1 ($0 - 1)))
|
|
*)
|
|
|
|
val args = CommandLine.arguments()
|
|
val input_string = hd args
|
|
val input_number = valOf (Int64.fromString input_string)
|
|
val func_name = hd (tl args)
|
|
val method_name = hd (tl (tl args))
|
|
|
|
local
|
|
val cond = BuiltinApp (Equal, Var 0, Int 0)
|
|
fun decrement x = BuiltinApp (Sub, x, Int 1)
|
|
fun add x y = BuiltinApp (Sum, x, y)
|
|
val branch = Branch (cond, Int 0, add (Int 1) (App (Var 1, decrement (Var 0))))
|
|
in
|
|
fun sum input_number = App (Fix (Lambda branch), Int input_number)
|
|
end
|
|
|
|
|
|
(* The term i want to define is:
|
|
fix (\sum. (\acc. \n. if n = 0 then acc else sum (acc + 1) (n - 1)))
|
|
|
|
Let us create the nameless representation
|
|
fix (\. (\. \. if $0 = 0 then $1 else $2 ($1 + $0) ($0 - 1)))
|
|
*)
|
|
|
|
local
|
|
val cond = BuiltinApp (Equal, Var 0, Int 0)
|
|
fun decrement x = BuiltinApp (Sub, x, Int 1)
|
|
fun sum x y = BuiltinApp (Sum, x, y)
|
|
val branch = Branch (cond, Var 1, App (App (Var 2, sum (Var 1) (Var 0)), decrement (Var 0)))
|
|
in
|
|
fun iter_sum input_number = App (App (Fix (Lambda (Lambda branch)), Int 0), Int input_number)
|
|
end
|
|
|
|
(* The term i want to define is:
|
|
fix (\fib. (\x. if x < 2 then x else fib (x - 1) + fib (x - 2)))
|
|
|
|
Let us create the nameless representation
|
|
fix (\. (\. if $0 < 2 then $0 else $1 ($0 - 1) + $1 ($0 - 2))) *)
|
|
|
|
local
|
|
val cond = BuiltinApp (LessThan, Var 0, Int 2)
|
|
fun sub x y = BuiltinApp (Sub, x, y)
|
|
val fib_minus_1 = App (Var 1, sub (Var 0) (Int 1))
|
|
val fib_minus_2 = App (Var 1, sub (Var 0) (Int 2))
|
|
val recursive_case = BuiltinApp (Sum, fib_minus_1, fib_minus_2)
|
|
val branch = Branch (cond, Var 0, recursive_case)
|
|
in
|
|
fun fib input_number = App (Fix (Lambda branch), Int input_number)
|
|
end
|
|
|
|
exception InvalidAlgo
|
|
|
|
val algo = case func_name of
|
|
"sum" => sum
|
|
| "fib" => fib
|
|
| "iter_sum" => iter_sum
|
|
| _ => raise InvalidAlgo
|
|
|
|
val term = algo input_number
|
|
val timer = Timer.startCPUTimer()
|
|
val _ = LambdaCal.pretty_print_value (LambdaCal.evaluate term)
|
|
val _ = print ((Int64.toString input_number) ^ " ")
|
|
val {usr, sys} = Timer.checkCPUTimer timer
|
|
val tot = Time.+ (usr, sys)
|
|
|
|
fun showMs t = Time.toString t
|
|
|
|
val _ = print (showMs tot)
|
|
val _ = print "\n"
|