nbe.ml
type t;;
type var = t name;;
type term =
Var of var
| Lam of <<var>>term
| App of term*term;;
type sem =
L of ((unit -> sem) -> sem)
| N of neu
and neu =
V of var
| A of neu*sem;;
let rec reify d =
match d with
L f -> let x=fresh in Lam(<<x>>(reify(f(function () -> N(V x)))))
| N n -> reifyn n
and reifyn n =
match n with
V x -> Var x
| A(n',d') -> App(reifyn n', reify d');;
let rec evals env t =
match t with
Var x -> (match env with
[] -> N(V x)
| (x',v)::env -> if x=x' then v()
else evals env (Var x))
| Lam(<<x>>t) -> L(function v -> evals ((x,v)::env) t)
| App(t1,t2) -> (match evals env t1 with
L f -> f(function () -> evals env t2)
| N n -> N(A(n,evals env t2)));;
let rec eval t = evals [] t;;
let norm t = reify(eval t);;
let equal(t1,t2) = ((norm t1)=(norm t2));;
let a,b,c=fresh,fresh,fresh;;
let s = Lam(<<a>>(
Lam(<<b>>(
Lam(<<c>>(
App(App(Var a,Var c),
App(Var b,Var c))))))));;
let k = Lam(<<a>>(Lam(<<b>>(Var a))));;
let i = Lam(<<a>>(Var a));;
let l = Lam(<<a>>i);;
let p = Lam(<<a>>(
Lam(<<b>>(
Lam(<<c>>(
App(App(Var c,Var a),Var b)))))));;
let p1 = Lam(<<c>>(App(Var c,k)));;
let p2 = Lam(<<c>>(App(Var c,l)));;
let omega = Lam(<<a>>(App(Var a, Var a)));;
let y = Lam(<<a>>(
App(Lam(<<b>>(App(Var a,
App(Var b,Var b)))),
Lam(<<b>>(App(Var a,
App(Var b,Var b)))))));;
let t = App(App(App(s,k),k),i);;
(norm t) = i;;
let i1 = App(p2,App(App(p,s),k));;
(norm i1) = k;;
let tm = App(l, App(omega,omega));;
(norm tm) = i;;
let loop = App(y,i);;
This document was generated using caml2html