(* Structural identity. Author: Carsten Schuermann *) id :: world (base param) all {N:exp} exists {K:exp} true fun id (A.x) = > | id (A.z) = > | id ((A.s) X) = let val > = id X in <(A.s) Y, <>> end | id ((A.app) E1 E2) = let val > = id E1 val > = id E2 in <(A.app) F1 F2, <>> end | id ((A.fn) T1 E1) = let val > = new (h:param T1) in id (E1 (h.x)) end in <(A.fn) T1 F1, <>> end new (b:base) val > = id ((b.s) ((b.s) ((b.s) ((b.s) ((b.s) ((b.s) (b.z))))))) val > = id (b.z) val > = id ((b.app) (b.z) (b.z)) val > = id ((b.fn) (b.nat) ([x:exp] x))