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