|  | Who Cites ioa  inv  vc? | 
|  | 
| ioa_inv_vc | Def VCs(A;I) ==  < *vc_imp(mk_imp(A.init, I))* >  +* ioa_trans_all{i}(A;I) | 
 | |  | Thm*  A:ioa{i:l}(), I:Fmla. VCs(A;I)  VCs | 
|  | 
| ioa_trans_all | Def ioa_trans_all{i}(A;I) ==  < ioa_trans(A;a.lbl;I) | a  A.da > | 
 | |  | Thm*  A:ioa{i:l}(), I:Fmla. ioa_trans_all{i}(A;I)  VCs | 
|  | 
| ioa_init | Def t.init == 1of(2of(2of(t))) | 
 | |  | Thm*  t:ioa{i:l}(). t.init  Collection(rel()) | 
 | |  | Thm*  t:ioa{i:l}(). t.init  Fmla | 
|  | 
| mk_imp | Def mk_imp(hyp, concl) ==  < hyp,concl > | 
 | |  | Thm*  hyp,concl:Fmla. mk_imp(hyp, concl)  imp{i:l}() | 
|  | 
| vc_imp | Def vc_imp(x) == inl(x) | 
 | |  | Thm*  x:imp{i:l}(). vc_imp(x)  vc{i:l}() | 
|  | 
| vcs_singleton | Def  < *v* >  ==  < v > | 
 | |  | Thm*  v:vc{i:l}().  < *v* >  VCs | 
|  | 
| vcs_add | Def a +* b == a + b | 
 | |  | Thm*  a,b:VCs. (a +* b)  VCs | 
|  | 
| dec_lbl | Def t.lbl == 1of(t) | 
 | |  | Thm*  t:dec(). t.lbl  Label | 
|  | 
| ioa_trans | Def ioa_trans(A;a;I) == vc_qimp(mk_qimp(a, I  action_pre(a;A.pre), smts_eff_pred(action_effect(a;A.eff;A.frame);I))) | 
 | |  | Thm*  A:ioa{i:l}(), a:Label, I:Fmla. ioa_trans(A;a;I)  vc{i:l}() | 
|  | 
| ioa_da | Def t.da == 1of(2of(t)) | 
 | |  | Thm*  t:ioa{i:l}(). t.da  Collection(dec()) | 
|  | 
| vc | Def vc{i:l}() == imp{i:l}()+qimp{i:l}() | 
 | |  | Thm* vc{i:l}()  Type{i'} | 
|  | 
| dec | Def dec() == Label  SimpleType | 
 | |  | Thm* dec()  Type | 
|  | 
| action_effect | Def action_effect(a;es;fs) ==  < e.smt | e  < e  es |  e.kind =  a >  >  +  < mk_smt(f.var, f.var, f.typ) | f  < f  fs |    a  f.acts >  > | 
 | |  | Thm*  a:Label, es:Collection(eff()), fs:Collection(frame()). action_effect(a;es;fs)  Collection(smt()) | 
|  | 
| smts_eff_pred | Def smts_eff_pred(ss;p) == (  r  p.smts_eff_rel(ss;r)) | 
 | |  | Thm*  p:Fmla, ss:Collection(smt()). smts_eff_pred(ss;p)  Fmla | 
|  | 
| action_pre | Def action_pre(a;ps) ==  < p.rel | p  < p  ps |  p.kind =  a >  > | 
 | |  | Thm*  a:Label, ps:Collection(pre()). action_pre(a;ps)  Fmla | 
|  | 
| smts_eff_rel | Def smts_eff_rel(ss;r) == col_subst(  x.smts_eff(ss;x);r) | 
 | |  | Thm*  r:rel(), ss:Collection(smt()). smts_eff_rel(ss;r)  Fmla | 
|  | 
| smts_eff | Def smts_eff(ss;x) == smt_terms( < s  ss |  s.lbl =  x > ) | 
 | |  | Thm*  ss:Collection(smt()), x:Label. smts_eff(ss;x)  Collection(Term) | 
|  | 
| col_subst | Def col_subst(c;r) == col_map_subst(as.rel_subst(as;r); < zip(rel_vars(r);s) | s  col_list_prod(map(c;rel_vars(r))) > ) | 
 | |  | Thm*  c:(Label   Collection(Term)), r:rel(). col_subst(c;r)  Fmla | 
 | |  | Thm*  c:(Label   Collection(Term)), r:rel(). col_subst(c;r)  Collection(rel()) | 
|  | 
| smt_terms | Def smt_terms(c) ==  < s.term | s  c > | 
 | |  | Thm*  c:Collection(smt()). smt_terms(c)  Collection(Term) | 
|  | 
| col_map_subst | Def col_map_subst(x.f(x);c) ==  < f(x) | x  c > | 
 | |  | Thm*  f:(((Label  Term) List)   rel()), c:Collection((Label  Term) List). col_map_subst(x.f(x);c)  Collection(rel()) | 
|  | 
| col_map | Def  < f(x) | x  c > (y) ==  x:T. x  c  &  y = f(x)  T' | 
 | |  | Thm*  T,T':Type, f:(T   T'), c:Collection(T).  < f(x) | x  c >  Collection(T') | 
|  | 
| ioa_frame | Def t.frame == 2of(2of(2of(2of(2of(t))))) | 
 | |  | Thm*  t:ioa{i:l}(). t.frame  Collection(frame()) | 
|  | 
| ioa_eff | Def t.eff == 1of(2of(2of(2of(2of(t))))) | 
 | |  | Thm*  t:ioa{i:l}(). t.eff  Collection(eff()) | 
|  | 
| ioa_pre | Def t.pre == 1of(2of(2of(2of(t)))) | 
 | |  | Thm*  t:ioa{i:l}(). t.pre  Collection(pre()) | 
|  | 
| frame_typ | Def t.typ == 1of(2of(t)) | 
 | |  | Thm*  t:frame(). t.typ  SimpleType | 
|  | 
| frame_acts | Def t.acts == 2of(2of(t)) | 
 | |  | Thm*  t:frame(). t.acts  Label List | 
|  | 
| eff_smt | Def t.smt == 2of(2of(2of(t))) | 
 | |  | Thm*  t:eff(). t.smt  smt() | 
|  | 
| pre_rel | Def t.rel == 2of(2of(t)) | 
 | |  | Thm*  t:pre(). t.rel  rel() | 
|  | 
| rel_vars | Def rel_vars(r) == reduce(  t,vs. term_vars(t) @ vs;nil;r.args) | 
 | |  | Thm*  r:rel(). rel_vars(r)  Label List | 
|  | 
| rel_subst | Def rel_subst(as;r) == mk_rel(r.name, map(  t.term_subst(as;t);r.args)) | 
 | |  | Thm*  r:rel(), as:(Label  Term) List. rel_subst(as;r)  rel() | 
|  | 
| smt_term | Def t.term == 1of(2of(t)) | 
 | |  | Thm*  t:smt(). t.term  Term | 
|  | 
| rel_args | Def t.args == 2of(t) | 
 | |  | Thm*  t:rel(). t.args  Term List | 
|  | 
| term_subst | Def term_subst(as;t)
== iterate(statevar v- > apply_alist(as;v;v)
 statevar v'- > apply_alist(as;v;v')
 funsymbol f- > f
 freevar f- > f
 trace(P)- > trace(P)
 x(y)- > x y
 over t) | 
 | |  | Thm*  t:Term, as:(Label  Term) List. term_subst(as;t)  Term | 
|  | 
| apply_alist | Def apply_alist(as;l;d) == 2of((first p  as s.t. 1of(p) =  l else  < l,d > )) | 
 | |  | Thm*  T:Type, as:(Label  T) List, l:Label, d:T. apply_alist(as;l;d)  T | 
|  | 
| pi2 | Def 2of(t) == t.2 | 
 | |  | Thm*  A:Type, B:(A   Type), p:(a:A  B(a)). 2of(p)  B(1of(p)) | 
|  | 
| frame_var | Def t.var == 1of(t) | 
 | |  | Thm*  t:frame(). t.var  Label | 
|  | 
| eff_kind | Def t.kind == 1of(t) | 
 | |  | Thm*  t:eff(). t.kind  Label | 
|  | 
| pre_kind | Def t.kind == 1of(t) | 
 | |  | Thm*  t:pre(). t.kind  Label | 
|  | 
| smt_lbl | Def t.lbl == 1of(t) | 
 | |  | Thm*  t:smt(). t.lbl  Label | 
|  | 
| rel_name | Def t.name == 1of(t) | 
 | |  | Thm*  t:rel(). t.name  relname() | 
|  | 
| pi1 | Def 1of(t) == t.1 | 
 | |  | Thm*  A:Type, B:(A   Type), p:(a:A  B(a)). 1of(p)  A | 
|  | 
| col_singleton | Def  < x > (y) == y = x  T | 
 | |  | Thm*  T:Type, x:T.  < x >  Collection(T) | 
|  | 
| pred_and | Def P  Q == P + Q | 
 | |  | Thm*  P,Q:Fmla. (P  Q)  Fmla | 
|  | 
| col_add | Def (a + b)(x) == x  a  x  b | 
 | |  | Thm*  T:Type, a,b:Collection(T). (a + b)  Collection(T) | 
|  | 
| mk_qimp | Def mk_qimp(lbl, hyp, concl) ==  < lbl,hyp,concl > | 
 | |  | Thm*  lbl:Label, hyp,concl:Fmla. mk_qimp(lbl, hyp, concl)  qimp{i:l}() | 
|  | 
| vc_qimp | Def vc_qimp(x) == inr(x) | 
 | |  | Thm*  x:qimp{i:l}(). vc_qimp(x)  vc{i:l}() | 
|  | 
| qimp | Def qimp{i:l}() == Label  Fmla  Fmla | 
 | |  | Thm* qimp{i:l}()  Type{i'} | 
|  | 
| imp | Def imp{i:l}() == Fmla  Fmla | 
 | |  | Thm* imp{i:l}()  Type{i'} | 
|  | 
| eff | Def eff() == Label  Label  SimpleType  smt() | 
 | |  | Thm* eff()  Type | 
|  | 
| smt | Def smt() == Label  Term  SimpleType | 
 | |  | Thm* smt()  Type | 
|  | 
| frame | Def frame() == Label  SimpleType  (Label List) | 
 | |  | Thm* frame()  Type | 
|  | 
| pre | Def pre() == Label  Label  rel() | 
 | |  | Thm* pre()  Type | 
|  | 
| pred | Def Fmla == Collection(rel()) | 
 | |  | Thm* Fmla{i}  Type{i'} | 
|  | 
| rel | Def rel() == relname()  (Term List) | 
 | |  | Thm* rel()  Type | 
|  | 
| relname | Def relname() == SimpleType+Label | 
 | |  | Thm* relname()  Type | 
|  | 
| st | Def SimpleType == Tree(Label+Unit) | 
 | |  | Thm* SimpleType  Type | 
|  | 
| term | Def Term == Tree(ts()) | 
 | |  | Thm* Term  Type | 
|  | 
| ts | Def ts() == Label+Label+Label+Label+Label | 
 | |  | Thm* ts()  Type | 
|  | 
| lbl | Def Label == {p:Pattern|  ground_ptn(p) } | 
 | |  | Thm* Label  Type | 
|  | 
| col_filter | Def  < x  c | P(x) > (x) == x  c  &  P(x) | 
 | |  | Thm*  T:Type, c:Collection(T), Q:(T   Prop).  < i  c | Q(i) >  Collection(T) | 
|  | 
| col_accum | Def (  x  c.f(x))(y) ==  x:T. x  c  &  y  f(x) | 
 | |  | Thm*  T,T':Type, f:(T   Collection(T')), c:Collection(T). (  x  c.f(x))  Collection(T') | 
|  | 
| col_list_prod | Def col_list_prod(l)(x) == ||x|| = ||l||    &  (  i:  . i < ||x||   x[i]  l[i]) | 
 | |  | Thm*  T:Type, l:Collection(T) List. col_list_prod(l)  Collection(T List) | 
|  | 
| col_member | Def x  c == c(x) | 
 | |  | Thm*  T:Type, x:T, c:Collection(T). x  c  Prop | 
|  | 
| tvar | Def l == tree_leaf(ts_var(l)) | 
 | |  | Thm*  l:Label. l  Term | 
|  | 
| mk_smt | Def mk_smt(lbl, term, typ) ==  < lbl,term,typ > | 
 | |  | Thm*  lbl:Label, term:Term, typ:SimpleType. mk_smt(lbl, term, typ)  smt() | 
|  | 
| lbls_member | Def x  ls == reduce(  a,b. x =  a   b;false  ;ls) | 
 | |  | Thm*  x:Label, ls:Label List. x  ls    | 
|  | 
| select | Def l[i] == hd(nth_tl(i;l)) | 
 | |  | Thm*  A:Type, l:A List, n:  . 0  n   n < ||l||   l[n]  A | 
|  | 
| nth_tl | Def nth_tl(n;as) == if n   0  as else nth_tl(n-1;tl(as)) fi  (recursive) | 
 | |  | Thm*  A:Type, as:A List, i:  . nth_tl(i;as)  A List | 
|  | 
| le_int | Def i   j ==   j <  i | 
 | |  | Thm*  i,j:  . (i   j)    | 
|  | 
| bnot | Def   b == if b  false  else true  fi | 
 | |  | Thm*  b:  .   b    | 
|  | 
| assert | Def  b == if b  True else False fi | 
 | |  | Thm*  b:  . b  Prop | 
|  | 
| eq_lbl | Def l1 =  l2 == Case(l1) Case ptn_atom(x) = >  Case(l2) Case ptn_atom(y) = >  x=  y  Atom Default = >  false  Case ptn_int(x) = >  Case(l2) Case ptn_int(y) = >  x=  y Default = >  false  Case ptn_var(x) = >  Case(l2) Case ptn_var(y) = >  x=  y  Atom Default = >  false  Case ptn_pr( < x, y > ) = >  Case(l2) Case ptn_pr( < u, v > ) = >  x =  u   y =  v Default = >  false  Default = >  false  (recursive) | 
 | |  | Thm*  l1,l2:Pattern. l1 =  l2    | 
|  | 
| tree | Def Tree(E) == rec(T.tree_con(E;T)) | 
 | |  | Thm*  E:Type. Tree(E)  Type | 
|  | 
| ground_ptn | Def ground_ptn(p) == Case(p) Case ptn_var(v) = >  false  Case ptn_pr( < x, y > ) = >  ground_ptn(x)   ground_ptn(y) Default = >  true  (recursive) | 
 | |  | Thm*  p:Pattern. ground_ptn(p)    | 
|  | 
| ptn | Def Pattern == rec(T.ptn_con(T)) | 
 | |  | Thm* Pattern  Type | 
|  | 
| ts_var | Def ts_var(x) == inl(x) | 
 | |  | Thm*  x:Label. ts_var(x)  ts() | 
|  | 
| ttrace | Def trace(l) == tree_leaf(ts_trace(l)) | 
 | |  | Thm*  l:Label. trace(l)  Term | 
|  | 
| tfvar | Def l == tree_leaf(ts_fvar(l)) | 
 | |  | Thm*  l:Label. l  Term | 
|  | 
| topr | Def f == tree_leaf(ts_op(f)) | 
 | |  | Thm*  f:Label. f  Term | 
|  | 
| tpvar | Def l' == tree_leaf(ts_pvar(l)) | 
 | |  | Thm*  l:Label. l'  Term | 
|  | 
| tree_leaf | Def tree_leaf(x) == inl(x) | 
 | |  | Thm*  E,T:Type, x:E. tree_leaf(x)  tree_con(E;T) | 
 | |  | Thm*  E:Type, x:E. tree_leaf(x)  Tree(E) | 
|  | 
| bor | Def p   q == if p  true  else q fi | 
 | |  | Thm*  p,q:  . (p   q)    | 
|  | 
| find | Def (first x  as s.t. P(x) else d) == Case of filter(  x.P(x);as); nil  d ; a.b  a | 
 | |  | Thm*  T:Type, P:(T    ), as:T List, d:T. (first a  as s.t. P(a) else d)  T | 
|  | 
| filter | Def filter(P;l) == reduce(  a,v. if P(a)  [a / v] else v fi;nil;l) | 
 | |  | Thm*  T:Type, P:(T    ), l:T List. filter(P;l)  T List | 
|  | 
| reduce | Def reduce(f;k;as) == Case of as; nil  k ; a.as'  f(a,reduce(f;k;as'))  (recursive) | 
 | |  | Thm*  A,B:Type, f:(A   B   B), k:B, as:A List. reduce(f;k;as)  B | 
|  | 
| term_vars | Def term_vars(t)
== iterate(statevar v- > [v]
 statevar v'- > [v]
 funsymbol f- > nil
 freevar f- > nil
 trace(P)- > nil
 x(y)- > x @ y
 over t) | 
 | |  | Thm*  t:Term. term_vars(t)  Label List | 
|  | 
| term_iter | Def iterate(statevar x- > v(x)
 statevar x''- > v'(x')
 funsymbol op- > opr(op)
 freevar f- > fvar(f)
 trace(tr)- > trace(tr)
 a(b)- > comb(a;b)
 over t)
== term_iterate(  x.v(x);  x'.v'(x');  op.opr(op);  f.fvar(f);  tr.trace(tr);  a,b. comb(a;b);
 t) | 
 | |  | Thm*  A:Type, v,v',opr,fvar,trace:(Label   A), comb:(A   A   A), t:Term.
iterate(statevar x- > v(x)
 statevar x''- > v'(x')
 funsymbol op- > opr(op)
 freevar f- > fvar(f)
 trace(tr)- > trace(tr)
 a(b)- > comb(a,b)
 over t)  A | 
|  | 
| term_iterate | Def term_iterate(v;p;op;f;tr;a;t) == t_iterate(  x.ts_case(x)var(a)= > v(a)var'(b)= > p(b)opr(c)= > op(c)fvar(d)= > f(d)trace(P)= > tr(P)end_ts_case ;a;t) | 
 | |  | Thm*  A:Type, v,op,f,p,tr:(Label   A), a:(A   A   A), t:Term. term_iterate(v;p;op;f;tr;a;t)  A | 
|  | 
| ts_case | Def ts_case(x)var(a)= > v(a)var'(b)= > p(b)opr(f)= > op(f)fvar(x)= > f(x)trace(P)= > t(P)end_ts_case  == Case(x) Case ts_var(a) = >  v(a) Case ts_pvar(b) = >  p(b) Case ts_op(f) = >  op(f) Case ts_fvar(x) = >  f(x) Case ts_trace(P) = >  t(P) Default = >  | 
 | |  | Thm*  A:Type, v,op,f,p,t:(Label   A), x:ts(). ts_case(x)var(a)= > v(a)var'(b)= > p(b)opr(f)= > op(f)fvar(y)= > f(y)trace(P)= > t(P)end_ts_case  A | 
|  | 
| t_iterate | Def t_iterate(l;n;t) == Case(t) Case x;y = >  n(t_iterate(l;n;x),t_iterate(l;n;y)) Case tree_leaf(x) = >  l(x) Default = >  True  (recursive) | 
 | |  | Thm*  E,A:Type, l:(E   A), n:(A   A   A), t:Tree(E). t_iterate(l;n;t)  A | 
|  | 
| case_default | Def Default = >  body(value,value) == body | 
|  | 
| band | Def p   q == if p  q else false  fi | 
 | |  | Thm*  p,q:  . (p   q)    | 
|  | 
| case_lbl_pair | Def Case ptn_pr( < x, y > ) = >  body(x;y) cont(x1,z) == InjCase(x1; _. cont(z,z); x2. InjCase(x2; _. cont(z,z); x2@0. InjCase(x2@0; _. cont(z,z); x2@1. x2@1/x3,x2@2. body(x3;x2@2)))) | 
|  | 
| case | Def Case(value) body == body(value,value) | 
|  | 
| eq_atom | Def x=  y  Atom == if x=y  Atom  true  ; false  fi | 
 | |  | Thm*  x,y:Atom. x=  y  Atom    | 
|  | 
| case_ptn_var | Def Case ptn_var(x) = >  body(x) cont(x1,z) == (  x1.inr(x2) = >  (  x1.inr(x2) = >  (  x1.inl(x2) = >  body(hd([x2 / tl(x1)])) cont(hd(x1),z))([x2 / tl(x1)]) cont(hd(x1),z))([x2 / tl(x1)]) cont(hd(x1),z))([x1]) | 
|  | 
| eq_int | Def i=  j == if i=j  true  ; false  fi | 
 | |  | Thm*  i,j:  . (i=  j)    | 
|  | 
| case_ptn_int | Def Case ptn_int(x) = >  body(x) cont(x1,z) == (  x1.inr(x2) = >  (  x1.inl(x2) = >  body(hd([x2 / tl(x1)])) cont(hd(x1),z))([x2 / tl(x1)]) cont(hd(x1),z))([x1]) | 
|  | 
| case_ptn_atom | Def Case ptn_atom(x) = >  body(x) cont(x1,z) == InjCase(x1; x2. body(x2); _. cont(z,z)) | 
|  | 
| col | Def Collection(T) == T   Prop | 
 | |  | Thm*  T:Type{i'}. Collection{i}(T)  Type{i'} | 
|  | 
| tree_con | Def tree_con(E;T) == E+(T  T) | 
 | |  | Thm*  E,T:Type. tree_con(E;T)  Type | 
|  | 
| ptn_con | Def ptn_con(T) == Atom+  +Atom+(T  T) | 
 | |  | Thm*  T:Type. ptn_con(T)  Type | 
|  | 
| case_ts_trace | Def Case ts_trace(x) = >  body(x) cont(x1,z) == (  x1.inr(x2) = >  (  x1.inr(x2) = >  (  x1.inr(x2) = >  (  x1.inr(x2) = >  body(hd([x2 / tl(x1)])) cont(hd(x1),z))([x2 / tl(x1)]) cont(hd(x1),z))([x2 / tl(x1)]) cont(hd(x1),z))([x2 / tl(x1)]) cont(hd(x1),z))([x1]) | 
|  | 
| case_ts_fvar | Def Case ts_fvar(x) = >  body(x) cont(x1,z) == (  x1.inr(x2) = >  (  x1.inr(x2) = >  (  x1.inr(x2) = >  (  x1.inl(x2) = >  body(hd([x2 / tl(x1)])) cont(hd(x1),z))([x2 / tl(x1)]) cont(hd(x1),z))([x2 / tl(x1)]) cont(hd(x1),z))([x2 / tl(x1)]) cont(hd(x1),z))([x1]) | 
|  | 
| case_ts_op | Def Case ts_op(x) = >  body(x) cont(x1,z) == (  x1.inr(x2) = >  (  x1.inr(x2) = >  (  x1.inl(x2) = >  body(hd([x2 / tl(x1)])) cont(hd(x1),z))([x2 / tl(x1)]) cont(hd(x1),z))([x2 / tl(x1)]) cont(hd(x1),z))([x1]) | 
|  | 
| case_ts_pvar | Def Case ts_pvar(x) = >  body(x) cont(x1,z) == (  x1.inr(x2) = >  (  x1.inl(x2) = >  body(hd([x2 / tl(x1)])) cont(hd(x1),z))([x2 / tl(x1)]) cont(hd(x1),z))([x1]) | 
|  | 
| hd | Def hd(l) == Case of l; nil  "?" ; h.t  h | 
 | |  | Thm*  A:Type, l:A List. ||l||  1   hd(l)  A | 
 | |  | Thm*  A:Type, l:A List  . hd(l)  A | 
|  | 
| tl | Def tl(l) == Case of l; nil  nil ; h.t  t | 
 | |  | Thm*  A:Type, l:A List. tl(l)  A List | 
|  | 
| case_inl | Def inl(x) = >  body(x) cont(value,contvalue) == InjCase(value; x. body(x); _. cont(contvalue,contvalue)) | 
|  | 
| case_inr | Def inr(x) = >  body(x) cont(value,contvalue) == InjCase(value; _. cont(contvalue,contvalue); x. body(x)) | 
|  | 
| zip | Def zip(as;bs) == Case of as; nil  nil ; a.as'  Case of bs; nil  nil ; b.bs'  [ < a,b >  / zip(as';bs')]  (recursive) | 
 | |  | Thm*  T1,T2:Type, as:T1 List, bs:T2 List. zip(as;bs)  (T1  T2) List | 
|  | 
| map | Def map(f;as) == Case of as; nil  nil ; a.as'  [(f(a)) / map(f;as')]  (recursive) | 
 | |  | Thm*  A,B:Type, f:(A   B), l:A List. map(f;l)  B List | 
 | |  | Thm*  A,B:Type, f:(A   B), l:A List  . map(f;l)  B List  | 
|  | 
| append | Def as @ bs == Case of as; nil  bs ; a.as'  [a / (as' @ bs)]  (recursive) | 
 | |  | Thm*  T:Type, as,bs:T List. (as @ bs)  T List | 
|  | 
| length | Def ||as|| == Case of as; nil  0 ; a.as'  ||as'||+1  (recursive) | 
 | |  | Thm*  A:Type, l:A List. ||l||    | 
 | |  | Thm* ||nil||    | 
|  | 
| nat | Def  == {i:  | 0  i } | 
 | |  | Thm*    Type | 
|  | 
| mk_rel | Def mk_rel(name, args) ==  < name,args > | 
 | |  | Thm*  name:relname(), args:Term List. mk_rel(name, args)  rel() | 
|  | 
| le | Def A  B ==  B < A | 
 | |  | Thm*  i,j:  . (i  j)  Prop | 
|  | 
| tapp | Def t1 t2 == tree_node( < t1, t2 > ) | 
 | |  | Thm*  t1,t2:Term. t1 t2  Term | 
|  | 
| not | Def  A == A   False | 
 | |  | Thm*  A:Prop. (  A)  Prop | 
|  | 
| node | Def tree_node( < x, y > ) == tree_node( < x,y > ) | 
 | |  | Thm*  E:Type, x,y:Tree(E). tree_node( < x, y > )  Tree(E) | 
|  | 
| ts_trace | Def ts_trace(x) == inr(inr(inr(inr(x)))) | 
 | |  | Thm*  x:Label. ts_trace(x)  ts() | 
|  | 
| ts_fvar | Def ts_fvar(x) == inr(inr(inr(inl(x)))) | 
 | |  | Thm*  x:Label. ts_fvar(x)  ts() | 
|  | 
| ts_op | Def ts_op(x) == inr(inr(inl(x))) | 
 | |  | Thm*  x:Label. ts_op(x)  ts() | 
|  | 
| ts_pvar | Def ts_pvar(x) == inr(inl(x)) | 
 | |  | Thm*  x:Label. ts_pvar(x)  ts() | 
|  | 
| lt_int | Def i <  j == if i < j  true  ; false  fi | 
 | |  | Thm*  i,j:  . (i <  j)    | 
|  | 
| tree_node | Def tree_node(x) == inr(x) | 
 | |  | Thm*  E,T:Type, x:(T  T). tree_node(x)  tree_con(E;T) | 
 | |  | Thm*  E:Type, x,y:Tree(E). tree_node( < x,y > )  Tree(E) | 
|  | 
| case_ts_var | Def Case ts_var(x) = >  body(x) cont(x1,z) == InjCase(x1; x2. body(x2); _. cont(z,z)) | 
|  | 
| case_tree_leaf | Def Case tree_leaf(x) = >  body(x) cont(x1,z) == InjCase(x1; x2. body(x2); _. cont(z,z)) | 
|  | 
| case_node | Def Case x;y = >  body(x;y) cont(x1,z) == InjCase(x1; _. cont(z,z); x2. x2/x3,x2@0. body(x3;x2@0)) |