What follows is  not a definition but a body of
facts easily derived from the definition above.
 
 
 
T type iff    void
 or   atom
 or   int![]()
	or 
 (a=b in A)
  &  
  &  ![]()
	or 
 (a<b)
  &  
  int & 
  int
	or 
 A list
  &  A type
	or 
 A|B
  &  A type &  B type
	or 
(  x:A#B
  or   A#B
  )
 *
	   & A type &  
 if  ![]()
	or 
(  x:A->B
  or   A->B
  )
 *
	   & A type &  
 if  ![]()
	or 
(  {x:A|B}
  or   {A|B}
  )
 *
	   & A type &  
 if  ![]()
	or ![]()
 *
	  (  x,y:A//B
  or   A//B
  )
 *
	&  A type 
 *
	&  u,v,w are distinct and don't occur in B 
 *
	&  
  u:A->![]()
 *
	&  
  u:A->v:A->
->![]()
 *
	&  
  u:A->v:A->w:A->
->
->
 *
       ![]()
	or 
 Uk![]()
not 
  void  
  atom iff  ![]()
  int iff  ![]()
  (a=b in A) iff   axiom
  &  ![]()
  a<b iff   axiom
  &  
  &  
  &  m is less than n
  A list iff   A list type  
 *
		 &   nil
 or  
 (a.b)
  &  
  &  
  A list
  A|B iff   A|B type
 *
	   &  (
 inl(a)
  &  
 ) or 
 inr(b)
  &  
 
  x:A#B iff   x:A#B type &  
 <a,b>
  &  
  &  ![]()
  x:A->B iff   x:A->B type 
 *
	&  ![]()
\ u.b
  
 *
	 &  
  
 *
		if  ![]()
  {x:A|B} iff   {x:A|B} type  &  
  &  ![]()
  x,y:A//B iff   x,y:A//B type  &  ![]()
  Uk iff    void
 or   atom
 or   int![]()
	or 
 (a=b in A)
  &  
  Uk &  
  &  ![]()
	or 
 (a<b)
  &  
  int & 
  int
	or 
 A list
  &  
  Uk
	or 
 A|B
  &  
  Uk &  
  Uk
	or 
(  x:A#B
  or   A#B
  )
 *
	   &  
  Uk &  
  Uk if  ![]()
	or 
(  x:A->B
  or   A->B
  )
 *
	   &  
  Uk &  
  Uk if  ![]()
	or 
(  {x:A|B}
  or   {A|B}
  )
 *
	   &  
  Uk &  
  Uk if  ![]()
	or ![]()
 *
	  (  x,y:A//B
  or   A//B
  )
 *
	&  
  Uk	
 *
	&  
  Uk
 *
		 if  
  &  ![]()
 *
	&  u,v,w are distinct and don't occur in B
 *
	&  
  u:A->![]()
 *
	&  
  u:A->v:A->
->![]()
 *
	&  
  u:A->v:A->w:A->
->
->
 *
      ![]()
	or 
 Uj
 &  j is less than k