1 | 1. t: Term 2. u: Term Type{i'} 3. w: t:{v:Term| u(v) }  s:SimpleType, as:(Label Term) List, ds:Collection{i}(dec())
, da:Collection{i}(SimpleType), de:sig().
s term_types(ds;da;de;t) 
( x:Label.
(x term_vars(t)) 
( t:SimpleType. mk_dec(x, t) ds  t term_types(ds;da;de;apply_alist(as;x;x))))

s term_types(ds;da;de;term_subst(as;t)) 4. x: Label s:SimpleType, as:(Label Term) List, ds:Collection{i}(dec()), da:Collection{i}(SimpleType)
, de:sig().
s dec_lookup(ds;x) 
( x@0:Label.
(x@0 [x]) 
( t:SimpleType. mk_dec(x@0, t) ds  t term_types(ds;da;de;apply_alist(as;x@0;x@0))))

s term_types(ds;da;de;apply_alist(as;x;x')) |
2 | 1. t: Term 2. u: Term Type{i'} 3. w: t:{v:Term| u(v) }  s:SimpleType, as:(Label Term) List, ds:Collection{i}(dec())
, da:Collection{i}(SimpleType), de:sig().
s term_types(ds;da;de;t) 
( x:Label.
(x term_vars(t)) 
( t:SimpleType. mk_dec(x, t) ds  t term_types(ds;da;de;apply_alist(as;x;x))))

s term_types(ds;da;de;term_subst(as;t)) 4. y1: {v:Term| u(v) } 5. y2: {v:Term| u(v) } s:SimpleType, as:(Label Term) List, ds:Collection{i}(dec()), da:Collection{i}(SimpleType)
, de:sig().
s st_app(term_types(ds;da;de;y1);term_types(ds;da;de;y2)) 
( x:Label.
(x term_vars(y1) @ term_vars(y2)) 
( t:SimpleType. mk_dec(x, t) ds  t term_types(ds;da;de;apply_alist(as;x;x))))

s st_app(term_types(ds;da;de;term_subst(as;y1));term_types(ds;da;de;term_subst(as;y2))) |