telescope/main.sml

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"