Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
(* 1.6 lambda-calcul *****************************************************)
module VarSet = Set.Make (struct type t = int let compare=compare end);;
type lambda_term = Var of int | Abstr of int*lambda_term |
Appl of lambda_term*lambda_term ;;
let var_count = ref 0;;
let new_var () = var_count:=!var_count+1; !var_count;;
let rec free_vars = function (Var x) -> VarSet.singleton x
| (Abstr(x,e)) -> VarSet.remove x (free_vars e)
| (Appl(e1,e2)) -> VarSet.union (free_vars e1) (free_vars e2);;
let rec subst e1 (x,e2) fv = match e1 with (Var y) when x=y -> e2
| (Var y) -> Var y
| (Abstr(y,e)) when x=y -> Abstr(y,e)
| (Abstr(y,e)) when (VarSet.mem y fv) -> let z = new_var() in
Abstr(z, subst (subst e (y,Var z) (VarSet.singleton z)) (x,e2) fv)
| (Abstr(y,e)) -> Abstr(y, subst e (x,e2) fv)
| (Appl(e,f)) -> Appl(subst e (x,e2) fv, subst f (x,e2) fv);;
let substitution e1 (x,e2) = subst e1 (x,e2) (free_vars e2);;
let rec interpret = function (Var x) -> Var x
| (Abstr(x,e)) -> Abstr(x,interpret e)
| (Appl(e1,e2)) -> let ie1 = interpret e1 in ( match ie1 with
(Abstr(x,e)) -> interpret (substitution e (x,e2))
| _ -> Appl(ie1, interpret e2) );;
let x = new_var();;
let y = new_var();;
let t = Abstr(x, Abstr(y, Var x));;
let f = Abstr(x, Abstr(y, Var y));;
let cond e1 e2 e3 = Appl(Appl(t, e1), e2);;
interpret(cond t t f);;