|   | Who Cites decl? | 
 | 
| decl |  Def Decl == Label  Type | 
 | |   | Thm* Decl{i}   Type{i'} | 
 | 
| ioa |  Def ioa{i:l}() == Collection(dec()) Collection(dec()) Collection(rel()) Collection(pre()) Collection(eff()) Collection(frame()) | 
 | |   | Thm* ioa{i:l}()   Type{i'} | 
 | 
| ioa_da |  Def t.da == 1of(2of(t)) | 
 | |   |  Thm*  t:ioa{i:l}(). t.da   Collection(dec()) | 
 | 
| ioa_mentions_trace |  Def ioa_mentions_trace(A) == ( e:eff(). e   A.eff  &   mentions_trace(e.smt.term))   ( p:pre(). p   A.pre  &   rel_mentions_trace(p.rel))   ( r:rel(). r   A.init  &   rel_mentions_trace(r)) | 
 | |   | Thm*  A:ioa{i:l}(). ioa_mentions_trace(A)   Prop | 
 | 
| pred |  Def Fmla == Collection(rel()) | 
 | |   | Thm* Fmla{i}   Type{i'} | 
 | 
| trace_consistent_pred |  Def trace_consistent_pred(rho;da;R;p) == ( r p.trace_consistent_rel(rho;da;R;r)) | 
 | |   |  Thm*  p:Fmla, rho:Decl, da:Collection(dec()), R:(Label  Label   ). trace_consistent_pred(rho;da;R;p)   Prop | 
 | 
| wp |  Def wp(A;a;Q) == smts_eff_pred(action_effect(a;A.eff;A.frame);Q) | 
 | |   | Thm*  A:ioa{i:l}(), a:Label, Q:Fmla. wp(A;a;Q)   Fmla | 
 | 
| 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()) | 
 | 
| frame |  Def frame() == Label SimpleType (Label List) | 
 | |   | Thm* frame()   Type | 
 | 
| eff |  Def eff() == Label Label SimpleType smt() | 
 | |   | Thm* eff()   Type | 
 | 
| pre |  Def pre() == Label Label rel() | 
 | |   | Thm* pre()   Type | 
 | 
| 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 | 
 | 
| 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 | 
 | 
| 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()) | 
 | 
| 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()) | 
 | 
| rel |  Def rel() == relname() (Term List) | 
 | |   | Thm* rel()   Type | 
 | 
| trace_consistent_rel |  Def trace_consistent_rel(rho;da;R;r) ==  i: ||r.args||. trace_consistent(rho;da;R;r.args[i]) | 
 | |   | Thm*  rho:Decl, r:rel(), da:Collection(dec()), R:(Label  Label   ). trace_consistent_rel(rho;da;R;r)   Prop | 
 | 
| trace_consistent |  Def trace_consistent(rho;da;R;t) ==  g:Label.  term_mentions_guard(g;t)    subtype_rel(({a:( [[da]] rho)|  (R(g,kind(a))) } List); (rho(lbl_pr( < Trace, g > )))) | 
 | |   |  Thm*  rho:Decl, t:Term, da:Collection(dec()), R:(Label  Label   ). trace_consistent(rho;da;R;t)   Prop | 
 | 
| decls_mng |  Def [[ds]] rho == [[d]] rho for d   {d:dec()| d   ds } | 
 | |   | Thm*  ds:Collection(dec()), rho:Decl. [[ds]] rho   Decl | 
 | 
| dec |  Def dec() == Label SimpleType | 
 | |   | Thm* dec()   Type | 
 | 
| 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) | 
 | 
| smt_terms |  Def smt_terms(c) ==  < s.term | s   c >  | 
 | |   | Thm*  c:Collection(smt()). smt_terms(c)   Collection(Term) | 
 | 
| smt |  Def smt() == Label Term SimpleType | 
 | |   | Thm* smt()   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 | 
 | 
| sigma |  Def ( d) == l:Label decl_type(d;l) | 
 | |   | Thm*  d:Decl. ( d)   Type | 
 | 
| lbl |  Def Label == {p:Pattern|  ground_ptn(p) } | 
 | |   | Thm* Label   Type | 
 | 
| int_seg |  Def {i..j } == {k: | i   k  <  j } | 
 | |   | Thm*  m,n: . {m..n }   Type | 
 | 
| lelt |  Def i   j  <  k == i j  &  j < k | 
 | 
| 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) | 
 | 
| nat |  Def   == {i: | 0 i } | 
 | |   | Thm*     Type | 
 | 
| le |  Def A B ==  B < A | 
 | |   | Thm*  i,j: . (i j)   Prop | 
 | 
| not |  Def  A == A    False | 
 | |   | Thm*  A:Prop. ( A)   Prop | 
 | 
| col |  Def Collection(T) == T  Prop | 
 | |   | Thm*  T:Type{i'}. Collection{i}(T)   Type{i'} | 
 | 
| rel_mentions_trace |  Def rel_mentions_trace(r) == reduce( x,y. mentions_trace(x)    y;false ;r.args) | 
 | |   | Thm*  r:rel(). rel_mentions_trace(r)     | 
 | 
| 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 | 
 | 
| pre_rel |  Def t.rel == 2of(2of(t)) | 
 | |   |  Thm*  t:pre(). t.rel   rel() | 
 | 
| ioa_pre |  Def t.pre == 1of(2of(2of(2of(t)))) | 
 | |   |  Thm*  t:ioa{i:l}(). t.pre   Collection(pre()) | 
 | 
| eff_smt |  Def t.smt == 2of(2of(2of(t))) | 
 | |   |  Thm*  t:eff(). t.smt   smt() | 
 | 
| smt_term |  Def t.term == 1of(2of(t)) | 
 | |   |  Thm*  t:smt(). t.term   Term | 
 | 
| ioa_eff |  Def t.eff == 1of(2of(2of(2of(2of(t))))) | 
 | |   |  Thm*  t:ioa{i:l}(). t.eff   Collection(eff()) | 
 | 
| ioa_frame |  Def t.frame == 2of(2of(2of(2of(2of(t))))) | 
 | |   |  Thm*  t:ioa{i:l}(). t.frame   Collection(frame()) | 
 | 
| 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() | 
 | 
| rel_args |  Def t.args == 2of(t) | 
 | |   |  Thm*  t:rel(). t.args   Term List | 
 | 
| 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 | 
 | 
| 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 | 
 | 
| kind |  Def kind(a) == 1of(a) | 
 | |   | Thm*  d:Decl, a:( d). kind(a)   Label | 
 | |   |  Thm*  M:sm{i:l}(), a:M.action. kind(a)   Label  &  kind(a)   Pattern | 
 | 
| 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 | 
 | 
| assert |  Def  b == if b  True else False fi | 
 | |   | Thm*  b: . b   Prop | 
 | 
| col_all |  Def ( x c.P(x)) ==  x:T. x   c    P(x) | 
 | |   | Thm*  T:Type, c:Collection(T), P:(T  Prop). ( x c.P(x))   Prop | 
 | 
| 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_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') | 
 | 
| col_add |  Def (a + b)(x) == x   a   x   b | 
 | |   | Thm*  T:Type, a,b:Collection(T). (a + b)   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_member |  Def x   c == c(x) | 
 | |   | Thm*  T:Type, x:T, c:Collection(T). x   c   Prop | 
 | 
| mentions_trace |  Def mentions_trace(t)
== iterate(statevar x- > false 
 statevar x'- > false 
 funsymbol x- > false 
 freevar x- > false 
 trace(P)- > true 
 x(y)- > x    y
 over t) | 
 | |   | Thm*  t:Term. mentions_trace(t)     | 
 | 
| 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 | 
 | 
| lbls_member |  Def x   ls == reduce( a,b. x =  a    b;false ;ls) | 
 | |   | Thm*  x:Label, ls:Label List. x   ls     | 
 | 
| term_mentions_guard |  Def term_mentions_guard(g;t) == term_iterate( x.false ; x.false ; x.false ; x.false ; x.x =  g; x,y. x    y;t) | 
 | |   | Thm*  t:Term, g:Label. term_mentions_guard(g;t)     | 
 | 
| 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 | 
 | 
| dec_mng |  Def [[d]] rho == Case(d) Case x : s = >   x:[[s]] rho | 
 | |   |  Thm*  rho:Decl, d:dec(). [[d]] rho   Decl | 
 | 
| dbase |  Def  x:y(a) == if a =  x  y else Top fi | 
 | |   | Thm*  x:Label, y:Type.  x:y   Decl | 
 | 
| 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     | 
 | 
| 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 | 
 | 
| st_mng |  Def [[s]] rho == t_iterate(st_lift(rho); x,y. x  y;s) | 
 | |   | Thm*  rho:Decl, s:SimpleType. [[s]] rho   Type | 
 | 
| 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_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]) | 
 | 
| case |  Def Case(value) body == body(value,value) | 
 | 
| ptn_con |  Def ptn_con(T) == Atom+ +Atom+(T T) | 
 | |   | Thm*  T:Type. ptn_con(T)   Type | 
 | 
| select |  Def l[i] == hd(nth_tl(i;l)) | 
 | |   |  Thm*  A:Type, l:A List, n: . 0 n    n < ||l||    l[n]   A | 
 | 
| length |  Def ||as|| == Case of as; nil   0 ; a.as'   ||as'||+1  (recursive) | 
 | |   |  Thm*  A:Type, l:A List. ||l||     | 
 | |   |  Thm* ||nil||     | 
 | 
| 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() | 
 | 
| 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     | 
 | 
| tree |  Def Tree(E) == rec(T.tree_con(E;T)) | 
 | |   |  Thm*  E:Type. Tree(E)   Type | 
 | 
| 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_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)) | 
 | 
| clbl |  Def $x == ptn_atom("$x") | 
 | 
| lbl_pair |  Def lbl_pr( < x, y > ) == ptn_pr( < x,y > ) | 
 | |   | Thm*  x,y:Pattern. lbl_pr( < x, y > )   Pattern | 
 | |   |  Thm*  x,y:Label. lbl_pr( < x, y > )   Label | 
 | 
| 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) | 
 | 
| eq_atom |  Def x= y Atom == if x=y Atom true ; false  fi | 
 | |   | Thm*  x,y:Atom. x= y Atom     | 
 | 
| eq_int |  Def i= j == if i=j  true  ; false  fi | 
 | |   | Thm*  i,j: . (i= j)     | 
 | 
| case_ptn_atom |  Def Case ptn_atom(x) = >  body(x) cont(x1,z) == InjCase(x1; x2. body(x2); _. cont(z,z)) | 
 | 
| tree_con |  Def tree_con(E;T) == E+(T T) | 
 | |   | Thm*  E,T:Type. tree_con(E;T)   Type | 
 | 
| ptn_atom |  Def ptn_atom(x) == inl(x) | 
 | |   | Thm*  T:Type, x:Atom. ptn_atom(x)   ptn_con(T) | 
 | |   |  Thm*  x:Atom. ptn_atom(x)   Pattern | 
 | |   |  Thm*  x:Atom. ptn_atom(x)   Label | 
 | 
| ptn_pr |  Def ptn_pr(x) == inr(inr(inr(x))) | 
 | |   | Thm*  T:Type, x:(T T). ptn_pr(x)   ptn_con(T) | 
 | |   |  Thm*  x,y:Pattern. ptn_pr( < x,y > )   Pattern | 
 | 
| dall |  Def D(i) for i   I(x) ==  i:I. D(i)(x) | 
 | |   | Thm*  I:Type, D:(I  Decl). D(i) for i   I   Decl | 
 | 
| decl_type |  Def decl_type(d;x) == d(x) | 
 | |   | Thm*  dec:Decl, x:Label. decl_type(dec;x)   Type | 
 | 
| 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  | 
 | 
| 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)) | 
 | 
| lt_int |  Def i <  j == if i < j  true  ; false  fi | 
 | |   | Thm*  i,j: . (i <  j)     | 
 | 
| case_mk_dec |  Def Case lbl : typ = >  body(lbl;typ)(x,z) == x/x2,x1. body(x2;x1) | 
 | 
| 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 | 
 | 
| mk_rel |  Def mk_rel(name, args) ==  < name,args >  | 
 | |   | Thm*  name:relname(), args:Term List. mk_rel(name, args)   rel() | 
 | 
| st_lift |  Def st_lift(rho)(x) == InjCase(x; x'. rho(x'); a. Top) | 
 | |   | Thm*  rho:(Label  Type). st_lift(rho)   (Label+Unit)  Type | 
 | 
| top |  Def Top == Void given Void | 
 | |   |  Thm* Top   Type | 
 | 
| tapp |  Def t1 t2 == tree_node( < t1, t2 > ) | 
 | |   | Thm*  t1,t2:Term. t1 t2   Term | 
 | 
| 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() | 
 | 
| 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) |