open Bwd (** Syntactic terms *) type syn = | Var of int | Pi of syn * (* BINDS *) syn | Lam of (* BINDS *) syn | App of syn * syn | Sg of syn * (* BINDS *) syn | Pair of syn * syn | Fst of syn | Snd of syn | Type | Bool | True | False | BoolElim of { motive : (* BINDS *) syn; true_case : syn; false_case : syn; scrut : syn; } (** Semantic domain *) type value = | Neutral of ne | Pi of value * clo | Lam of clo | Sg of value * clo | Pair of value * value | Type | Bool | True | False and ne = ne_head * frm bwd and ne_head = Var of int (* De Bruijn levels *) and frm = | App of value | Fst | Snd | BoolElim of { cmot: clo; vtrue: value; vfalse: value; } and env = value bwd and clo = Clo of { body : syn; env : env }