For convenience we
shall extend the relation 
 to possibly open terms.
If s or t contain free variables then 
 does not hold;
otherwise, it is true if and only if s has value t.
Also, define 
 to mean that 
 and 
.
Recall that the members of a type are its canonical members and the
terms which have those members as values.  The integers
are the canonical  members of 
the type  int.  The denumerably 
many atom constants are the canonical members of the type  atom.
The type  void is empty.  The type  A|B is like a disjoint
union of types A and B.
The terms  inl(a) and  inr(b) are canonical members so long as
 and 
; a and b need not be canonical.
(The operator names  inl
and  inr
are mnemonic for ``inject left'' and
``inject right''.)  The canonical
members of  x:A#B are the terms  <a,b> with 
 and 
,
a and b not necessarily canonical.  Note that the type from which the
second component is selected may depend on the value of the first
component.
The canonical members of the type  A list represent lists of members of A.
The empty list is represented by  nil. A
nonempty list with head a is
represented by  a.b, where b evaluates to a member of the type  A list 
and represents the tail.
A term of the form  t(a) is called an
 application of t to a, 
and a is called its  argument.
The members of  x:A->B are called  functions,
and each
canonical member is a  lambda term,
\ x.b,
whose application to any 
 is a member of 
.
It is required that applications to equal members of type A
be equal.
Clearly,  t(a)
 if  
  x:A->B and  
.
The significance of some constructors derives from the representation
of propositions  as types.
A proposition represented by a type is true if and only if the type
is inhabited. The type  a<b is inhabited
if and only if the value of a is less than the value of b.
The type  (a=b in A) is inhabited if and only if 
.  
Obviously, the type  (a=a in A) is inhabited if and only if 
,
so `` a in A'' has been adopted as a notation for this type.
The members of  {x:A|B} are the
members a of A such that 
 is inhabited.  
Types of the form  {x:A|B} are called
 set types.
The set constructor provides a device for specifying subtypes;
for example,  {x:int|0<x} has just the positive integers
as canonical members.
The members of  x,y:A//B are the members of A.
The difference between this type and A is equality.
  x,y:A//B if and only if  a and 
 are members
of A and 
 is inhabited.
Types of this form are called  quotient types.
The relation 
 is an equivalence relation
over A in a and 
;
this is built into the criteria for  x,y:A//B being a type.
Now consider equality  on the other types already discussed.
(Recall that
terms are equal in a given type if and only if they evaluate to canonical
terms equal in that type.
Recall also that 
 is an equivalence relation
in a and 
 when restricted to members of A.)
Members of  int are equal
(in  int) if and only if they have the same value.
The same goes for type  atom.
Canonical members of  A|B ( x:A#B,  A list) are 
equal if and only if they have the same outermost operator and their
corresponding immediate subterms are equal (in the corresponding types).
Members of  x:A->B are equal if and only if their applications
to any member a of A are equal in 
.
We say equality on  x:A->B is  extensional .
The types  a<b and  (a=b in A) have
at most one canonical member,  axiom.  
Equality in  {x:A|B} is just the
restriction of equality in A to  {x:A|B}.
We must now consider the notion of  functionality .
A term B is  type --functional in 
 if and only if
	A is a type and 
 
	for any a and 
 such that 
.
A term b is  B--functional in 
 if and only if
	B is type--functional in 
 and 
 
	for any a and 
 such that
	
.
There are restrictions on type formation involving type--functionality.
These can be seen in the type formation clauses 
of section 8.2 for  x:A#B,
 x:A->B, and  {x:A|B}.
In each of these B must be type--functional in x:A.
We may now say that the members of  x:A->B are the lambda terms
 \x.b such that b is B--functional in 
.
In the type  x,y:A//B, that B must be type--functional in both 
x,y:A follows
from the fact that  x:A->y:A->B->B must be a type.
There are also constraints on the typehood of  x,y:A//B which
guarantee that the relation 
is an equivalence  relation on members
of A and respects equality in A.
It should be noted that if A is empty then every term is type--functional
in its free variables over A.  Hence,  x:void#3 is a type 
(with no members) even though  3 is not a type.
Equal types have the same membership and equality, but not conversely. Type equality in
  is not extensional;
that is, it is not enough for type equality that two types should have
the same membership and equality.  In 
  equal  canonical types always
have the same outermost type constructor.
The relations that must hold between the
respective immediate subterms are seen easily enough in the definition of type
equality given in section 
 on page 
. 
It should be noted that in contrast to equality between types of the form
 x:A#B or  x:A->B,
much less is required for 
 {x:A|B}= {x:A|
} than type--functional
equality of B and 
 in x:A.  All that is required is the existence
of functions which for each 
 evaluate to functions
mapping back and forth between 
 and 
.
Equality between quotient types is defined similarly.
If x does not occur free in B
then  A#B= x:A#B,
 A->B= x:A->B,
and  {A|B}= {x:A|B};
if x and y do not occur free in B then 
 A//B= x,y:A//B.
As a result there is no need for clauses in the type system description
giving the criteria for 
  A#B and the others explicitly.
Now consider the so--called  universes ,
 (k positive).
The members of 
 are types.  The universes are
cumulative ; that is,
if j is less than k then membership and equality in 
 are just 
restrictions of membership and equality in 
.
Universe 
 is closed 
under all the type--forming operations except formation
of 
 for i greater than or equal to k.
Equality (hence membership) in 
 is similar to
type equality as defined previously
except that equality (membership)  in 
 is
required wherever type equality (typehood) was formerly required,
and although all universes are types, only those  Ui such that i is less
than k are in 
.  Equality in 
 is the restriction
of type equality to members of 
.
So far the only noncanonical  form explicitly
mentioned in
connection with the type system is application.  We shall elaborate
here on a couple of forms, and it should then be easy to
see how to treat the others.  The  spread  form is
used for computational
analysis of pairs.  The pair of components is  spread apart
so that the components can be used separately.
 
 
	 spread(e;x,y.t)
 if
 *
	![]()
 *
	&  T is type functional in z:( x:A#B)
 *
	& 
 <a ,b >
 
 *
	if 
 and 
 
 
 
Since 
then for some a and b
where 
, and  
.
Hence 
and 
have the same value, so it is enough
that 
But from our hypotheses it follows that 
so it is enough that 
Now
since 
  x:A#B and equality respects evaluation;
therefore 
in light of 
T's functionality in z: (x:A#B).
The list   induction form allows one to perform
inductive
analysis of lists.
 list_ind(e;s;x,y.t) is a function (in e) which
halts on all members of  A list.  It is the function (in e) defined by primitive 
recursion,
where s is the result for the base case of e= nil (in  A list) and
t shows how to build the value for e= x.y (in  A list) from x, y and the value 
of the function being defined on y, this value being passed through u during
evaluation.
 
	
 if 
 *
	
  A list 
 *
	& T is type functional in z:( A list) 
 *
	&  
 nil
 
 *
	& 
 
 *
	if 
  &  
  &  
 
 
 
Let us prove this by induction on the length of the list 
represented by e, all other variables universally quantified.  
Suppose 
.  By definition we know that
 list_ind(e;s;x,y,u.t)
and s
have the same value,
so it is enough for the base case that 
;
this is true since T is functional in 
 A list,
, and 
.
Now suppose that for some a and b,  a.b
  
, 
 , and 
.
Now
![]()
and
![]()
have the same value, so it is enough that the substitution into t
is in 
.
 and b represents a shorter list than e; therefore,
by inductive hypothesis 
![]()
It follows that the substitution into t is in 
, so it
is enough that 
; this holds because of T's functionality
and the equality of  a.b and e (in  A list).
The  decide form is used to discern a left from a right injection, and
to permit computation on the injected term.  The  ind form is used
to define functions recursively on integers.
The reader is referred to chapter 2 or to the exposition of the rules for further 
elaboration of the use of noncanonical forms.