doc-src/Logics/CTT.tex
changeset 104 d8205bb279a7
child 111 1b3cddf41b2d
equal deleted inserted replaced
103:30bd42401ab2 104:d8205bb279a7
       
     1 %% $Id$
       
     2 \chapter{Constructive Type Theory}
       
     3 Martin-L\"of's Constructive Type Theory \cite{martinlof84,nordstrom90} can
       
     4 be viewed at many different levels.  It is a formal system that embodies
       
     5 the principles of intuitionistic mathematics; it embodies the
       
     6 interpretation of propositions as types; it is a vehicle for deriving
       
     7 programs from proofs.  The logic is complex and many authors have attempted
       
     8 to simplify it.  Thompson~\cite{thompson91} is a readable and thorough
       
     9 account of the theory.
       
    10 
       
    11 Isabelle's original formulation of Type Theory was a kind of sequent
       
    12 calculus, following Martin-L\"of~\cite{martinlof84}.  It included rules for
       
    13 building the context, namely variable bindings with their types.  A typical
       
    14 judgement was
       
    15 \[   a(x@1,\ldots,x@n)\in A(x@1,\ldots,x@n) \; 
       
    16     [ x@1\in A@1, x@2\in A@2(x@1), \ldots, x@n\in A@n(x@1,\ldots,x@{n-1}) ]
       
    17 \]
       
    18 This sequent calculus was not satisfactory because assumptions like
       
    19 `suppose $A$ is a type' or `suppose $B(x)$ is a type for all $x$ in $A$'
       
    20 could not be formalized.  
       
    21 
       
    22 The directory~\ttindexbold{CTT} implements Constructive Type Theory, using
       
    23 natural deduction.  The judgement above is expressed using $\Forall$ and
       
    24 $\Imp$:
       
    25 \[ \begin{array}{r@{}l}
       
    26      \Forall x@1\ldots x@n. &
       
    27 	  \List{x@1\in A@1; 
       
    28 		x@2\in A@2(x@1); \cdots \; 
       
    29 		x@n\in A@n(x@1,\ldots,x@{n-1})} \Imp \\
       
    30      &  \qquad\qquad a(x@1,\ldots,x@n)\in A(x@1,\ldots,x@n) 
       
    31     \end{array}
       
    32 \]
       
    33 Assumptions can use all the judgement forms, for instance to express that
       
    34 $B$ is a family of types over~$A$:
       
    35 \[ \Forall x . x\in A \Imp B(x)\;{\rm type} \]
       
    36 To justify the {\CTT} formulation it is probably best to appeal directly
       
    37 to the semantic explanations of the rules~\cite{martinlof84}, rather than
       
    38 to the rules themselves.  The order of assumptions no longer matters,
       
    39 unlike in standard Type Theory.  Contexts, which are typical of many modern
       
    40 type theories, are difficult to represent in Isabelle.  In particular, it
       
    41 is difficult to enforce that all the variables in a context are distinct.
       
    42 
       
    43 The theory has the {\ML} identifier \ttindexbold{CTT.thy}.  It does not
       
    44 use polymorphism.  Terms in {\CTT} have type~$i$, the type of individuals.
       
    45 Types in {\CTT} have type~$t$.
       
    46 
       
    47 {\CTT} supports all of Type Theory apart from list types, well ordering
       
    48 types, and universes.  Universes could be introduced {\em\`a la Tarski},
       
    49 adding new constants as names for types.  The formulation {\em\`a la
       
    50 Russell}, where types denote themselves, is only possible if we identify
       
    51 the meta-types~$i$ and~$o$.  Most published formulations of well ordering
       
    52 types have difficulties involving extensionality of functions; I suggest
       
    53 that you use some other method for defining recursive types.  List types
       
    54 are easy to introduce by declaring new rules.
       
    55 
       
    56 {\CTT} uses the 1982 version of Type Theory, with extensional equality.
       
    57 The computation $a=b\in A$ and the equality $c\in Eq(A,a,b)$ are
       
    58 interchangeable.  Its rewriting tactics prove theorems of the form $a=b\in
       
    59 A$.  It could be modified to have intensional equality, but rewriting
       
    60 tactics would have to prove theorems of the form $c\in Eq(A,a,b)$ and the
       
    61 computation rules might require a second simplifier.
       
    62 
       
    63 
       
    64 \begin{figure} \tabcolsep=1em  %wider spacing in tables
       
    65 \begin{center}
       
    66 \begin{tabular}{rrr} 
       
    67   \it symbol  	& \it meta-type 	& \it description \\ 
       
    68   \idx{Type}    & $t \to prop$		& judgement form \\
       
    69   \idx{Eqtype}  & $[t,t]\to prop$	& judgement form\\
       
    70   \idx{Elem}    & $[i, t]\to prop$	& judgement form\\
       
    71   \idx{Eqelem}  & $[i, i, t]\to prop$	& judgement form\\
       
    72   \idx{Reduce}  & $[i, i]\to prop$	& extra judgement form\\[2ex]
       
    73 
       
    74   \idx{N}       &     $t$		& natural numbers type\\
       
    75   \idx{0}       &     $i$		& constructor\\
       
    76   \idx{succ}    & $i\to i$		& constructor\\
       
    77   \idx{rec}     & $[i,i,[i,i]\to i]\to i$       & eliminator\\[2ex]
       
    78   \idx{Prod}    & $[t,i\to t]\to t$	& general product type\\
       
    79   \idx{lambda}  & $(i\to i)\to i$	& constructor\\[2ex]
       
    80   \idx{Sum}     & $[t, i\to t]\to t$	& general sum type\\
       
    81   \idx{pair}    & $[i,i]\to i$		& constructor\\
       
    82   \idx{split}   & $[i,[i,i]\to i]\to i$	& eliminator\\
       
    83   \idx{fst} snd & $i\to i$		& projections\\[2ex]
       
    84   \idx{inl} inr & $i\to i$		& constructors for $+$\\
       
    85   \idx{when}    & $[i,i\to i, i\to i]\to i$    & eliminator for $+$\\[2ex]
       
    86   \idx{Eq}      & $[t,i,i]\to t$	& equality type\\
       
    87   \idx{eq}      & $i$			& constructor\\[2ex]
       
    88   \idx{F}       & $t$			& empty type\\
       
    89   \idx{contr}   & $i\to i$		& eliminator\\[2ex]
       
    90   \idx{T}       & $t$			& singleton type\\
       
    91   \idx{tt}      & $i$			& constructor
       
    92 \end{tabular}
       
    93 \end{center}
       
    94 \caption{The constants of {\CTT}} \label{ctt-constants}
       
    95 \end{figure}
       
    96 
       
    97 
       
    98 \begin{figure} \tabcolsep=1em  %wider spacing in tables
       
    99 \begin{center}
       
   100 \begin{tabular}{llrrr} 
       
   101   \it symbol &\it name	   &\it meta-type & \it precedence & \it description \\
       
   102   \idx{lam} & \idx{lambda}  & $(i\To o)\To i$ & 10 & $\lambda$-abstraction
       
   103 \end{tabular}
       
   104 \end{center}
       
   105 \subcaption{Binders} 
       
   106 
       
   107 \begin{center}
       
   108 \indexbold{*"`}
       
   109 \indexbold{*"+}
       
   110 \begin{tabular}{rrrr} 
       
   111   \it symbol & \it meta-type & \it precedence & \it description \\ 
       
   112   \tt `		& $[i,i]\to i$	& Left 55 	& function application\\
       
   113   \tt +		& $[t,t]\to t$	& Right 30 	& sum of two types
       
   114 \end{tabular}
       
   115 \end{center}
       
   116 \subcaption{Infixes}
       
   117 
       
   118 \indexbold{*"*}
       
   119 \indexbold{*"-"-">}
       
   120 \begin{center} \tt\frenchspacing
       
   121 \begin{tabular}{rrr} 
       
   122   \it external                	& \it internal  & \it standard notation \\ 
       
   123   \idx{PROD} $x$:$A$ . $B[x]$	&  Prod($A$, $\lambda x.B[x]$) &
       
   124       	\rm product $\prod@{x\in A}B[x]$ \\
       
   125   \idx{SUM} $x$:$A$ . $B[x]$	& Sum($A$, $\lambda x.B[x]$) &
       
   126       	\rm sum $\sum@{x\in A}B[x]$ \\
       
   127   $A$ --> $B$     &  Prod($A$, $\lambda x.B$) &
       
   128 	\rm function space $A\to B$ \\
       
   129   $A$ * $B$       &  Sum($A$, $\lambda x.B$)  &
       
   130 	\rm binary product $A\times B$
       
   131 \end{tabular}
       
   132 \end{center}
       
   133 \subcaption{Translations} 
       
   134 
       
   135 \indexbold{*"=}
       
   136 \begin{center}
       
   137 \dquotes
       
   138 \[ \begin{array}{rcl}
       
   139 prop  	& = &  type " type"       \\
       
   140 	& | & type " = " type     \\
       
   141 	& | & term " : " type        \\
       
   142 	& | & term " = " term " : " type 
       
   143 \\[2ex]
       
   144 type  	& = & \hbox{expression of type~$t$} \\
       
   145 	& | & "PROD~" id " : " type " . " type  \\
       
   146 	& | & "SUM~~" id " : " type " . " type 
       
   147 \\[2ex]
       
   148 term  	& = & \hbox{expression of type~$i$} \\
       
   149 	& | & "lam " id~id^* " . " term   \\
       
   150 	& | & "< " term " , " term " >"
       
   151 \end{array} 
       
   152 \]
       
   153 \end{center}
       
   154 \subcaption{Grammar}
       
   155 \caption{Syntax of {\CTT}} \label{ctt-syntax}
       
   156 \end{figure}
       
   157 
       
   158 %%%%\section{Generic Packages}  typedsimp.ML????????????????
       
   159 
       
   160 
       
   161 \section{Syntax}
       
   162 The constants are shown in Figure~\ref{ctt-constants}.  The infixes include
       
   163 the function application operator (sometimes called `apply'), and the
       
   164 2-place type operators.  Note that meta-level abstraction and application,
       
   165 $\lambda x.b$ and $f(a)$, differ from object-level abstraction and
       
   166 application, \hbox{\tt lam $x$.$b$} and $b{\tt`}a$.  A {\CTT}
       
   167 function~$f$ is simply an individual as far as Isabelle is concerned: its
       
   168 Isabelle type is~$i$, not say $i\To i$.
       
   169 
       
   170 \indexbold{*F}\indexbold{*T}\indexbold{*SUM}\indexbold{*PROD}
       
   171 The empty type is called $F$ and the one-element type is $T$; other finite
       
   172 sets are built as $T+T+T$, etc.  The notation for~{\CTT}
       
   173 (Figure~\ref{ctt-syntax}) is based on that of Nordstr\"om et
       
   174 al.~\cite{nordstrom90}.  We can write
       
   175 \begin{ttbox}
       
   176 SUM y:B. PROD x:A. C(x,y)   {\rm for}   Sum(B, %y. Prod(A, %x. C(x,y)))
       
   177 \end{ttbox}
       
   178 The special cases as \hbox{\tt$A$*$B$} and \hbox{\tt$A$-->$B$} abbreviate
       
   179 general sums and products over a constant family.\footnote{Unlike normal
       
   180 infix operators, {\tt*} and {\tt-->} merely define abbreviations; there are
       
   181 no constants~{\tt op~*} and~\hbox{\tt op~-->}.}  Isabelle accepts these
       
   182 abbreviations in parsing and uses them whenever possible for printing.
       
   183 
       
   184 
       
   185 \begin{figure} 
       
   186 \begin{ttbox}
       
   187 \idx{refl_type}         A type ==> A = A
       
   188 \idx{refl_elem}         a : A ==> a = a : A
       
   189 
       
   190 \idx{sym_type}          A = B ==> B = A
       
   191 \idx{sym_elem}          a = b : A ==> b = a : A
       
   192 
       
   193 \idx{trans_type}        [| A = B;  B = C |] ==> A = C
       
   194 \idx{trans_elem}        [| a = b : A;  b = c : A |] ==> a = c : A
       
   195 
       
   196 \idx{equal_types}       [| a : A;  A = B |] ==> a : B
       
   197 \idx{equal_typesL}      [| a = b : A;  A = B |] ==> a = b : B
       
   198 
       
   199 \idx{subst_type}        [| a : A;  !!z. z:A ==> B(z) type |] ==> B(a) type
       
   200 \idx{subst_typeL}       [| a = c : A;  !!z. z:A ==> B(z) = D(z) 
       
   201                   |] ==> B(a) = D(c)
       
   202 
       
   203 \idx{subst_elem}        [| a : A;  !!z. z:A ==> b(z):B(z) |] ==> b(a):B(a)
       
   204 \idx{subst_elemL}       [| a = c : A;  !!z. z:A ==> b(z) = d(z) : B(z) 
       
   205                   |] ==> b(a) = d(c) : B(a)
       
   206 
       
   207 \idx{refl_red}          Reduce(a,a)
       
   208 \idx{red_if_equal}      a = b : A ==> Reduce(a,b)
       
   209 \idx{trans_red}         [| a = b : A;  Reduce(b,c) |] ==> a = c : A
       
   210 \end{ttbox}
       
   211 \caption{General equality rules} \label{ctt-equality}
       
   212 \end{figure}
       
   213 
       
   214 
       
   215 \begin{figure} 
       
   216 \begin{ttbox}
       
   217 \idx{NF}        N type
       
   218 
       
   219 \idx{NI0}       0 : N
       
   220 \idx{NI_succ}   a : N ==> succ(a) : N
       
   221 \idx{NI_succL}  a = b : N ==> succ(a) = succ(b) : N
       
   222 
       
   223 \idx{NE}        [| p: N;  a: C(0);  
       
   224              !!u v. [| u: N; v: C(u) |] ==> b(u,v): C(succ(u)) 
       
   225           |] ==> rec(p, a, %u v.b(u,v)) : C(p)
       
   226 
       
   227 \idx{NEL}       [| p = q : N;  a = c : C(0);  
       
   228              !!u v. [| u: N; v: C(u) |] ==> b(u,v)=d(u,v): C(succ(u))
       
   229           |] ==> rec(p, a, %u v.b(u,v)) = rec(q,c,d) : C(p)
       
   230 
       
   231 \idx{NC0}       [| a: C(0);  
       
   232              !!u v. [| u: N; v: C(u) |] ==> b(u,v): C(succ(u))
       
   233           |] ==> rec(0, a, %u v.b(u,v)) = a : C(0)
       
   234 
       
   235 \idx{NC_succ}   [| p: N;  a: C(0);  
       
   236              !!u v. [| u: N; v: C(u) |] ==> b(u,v): C(succ(u)) 
       
   237           |] ==> rec(succ(p), a, %u v.b(u,v)) =
       
   238                  b(p, rec(p, a, %u v.b(u,v))) : C(succ(p))
       
   239 
       
   240 \idx{zero_ne_succ}      [| a: N;  0 = succ(a) : N |] ==> 0: F
       
   241 \end{ttbox}
       
   242 \caption{Rules for type~$N$} \label{ctt-N}
       
   243 \end{figure}
       
   244 
       
   245 
       
   246 \begin{figure} 
       
   247 \begin{ttbox}
       
   248 \idx{ProdF}     [| A type; !!x. x:A ==> B(x) type |] ==> PROD x:A.B(x) type
       
   249 \idx{ProdFL}    [| A = C;  !!x. x:A ==> B(x) = D(x) |] ==> 
       
   250           PROD x:A.B(x) = PROD x:C.D(x)
       
   251 
       
   252 \idx{ProdI}     [| A type;  !!x. x:A ==> b(x):B(x)
       
   253           |] ==> lam x.b(x) : PROD x:A.B(x)
       
   254 \idx{ProdIL}    [| A type;  !!x. x:A ==> b(x) = c(x) : B(x)
       
   255           |] ==> lam x.b(x) = lam x.c(x) : PROD x:A.B(x)
       
   256 
       
   257 \idx{ProdE}     [| p : PROD x:A.B(x);  a : A |] ==> p`a : B(a)
       
   258 \idx{ProdEL}    [| p=q: PROD x:A.B(x);  a=b : A |] ==> p`a = q`b : B(a)
       
   259 
       
   260 \idx{ProdC}     [| a : A;  !!x. x:A ==> b(x) : B(x)
       
   261           |] ==> (lam x.b(x)) ` a = b(a) : B(a)
       
   262 
       
   263 \idx{ProdC2}    p : PROD x:A.B(x) ==> (lam x. p`x) = p : PROD x:A.B(x)
       
   264 \end{ttbox}
       
   265 \caption{Rules for the product type $\prod@{x\in A}B[x]$} \label{ctt-prod}
       
   266 \end{figure}
       
   267 
       
   268 
       
   269 \begin{figure} 
       
   270 \begin{ttbox}
       
   271 \idx{SumF}      [| A type;  !!x. x:A ==> B(x) type |] ==> SUM x:A.B(x) type
       
   272 \idx{SumFL}     [| A = C;  !!x. x:A ==> B(x) = D(x) 
       
   273           |] ==> SUM x:A.B(x) = SUM x:C.D(x)
       
   274 
       
   275 \idx{SumI}      [| a : A;  b : B(a) |] ==> <a,b> : SUM x:A.B(x)
       
   276 \idx{SumIL}     [| a=c:A;  b=d:B(a) |] ==> <a,b> = <c,d> : SUM x:A.B(x)
       
   277 
       
   278 \idx{SumE}      [| p: SUM x:A.B(x);  
       
   279              !!x y. [| x:A; y:B(x) |] ==> c(x,y): C(<x,y>) 
       
   280           |] ==> split(p, %x y.c(x,y)) : C(p)
       
   281 
       
   282 \idx{SumEL}     [| p=q : SUM x:A.B(x); 
       
   283              !!x y. [| x:A; y:B(x) |] ==> c(x,y)=d(x,y): C(<x,y>)
       
   284           |] ==> split(p, %x y.c(x,y)) = split(q, %x y.d(x,y)) : C(p)
       
   285 
       
   286 \idx{SumC}      [| a: A;  b: B(a);
       
   287              !!x y. [| x:A; y:B(x) |] ==> c(x,y): C(<x,y>)
       
   288           |] ==> split(<a,b>, %x y.c(x,y)) = c(a,b) : C(<a,b>)
       
   289 
       
   290 \idx{fst_def}   fst(a) == split(a, %x y.x)
       
   291 \idx{snd_def}   snd(a) == split(a, %x y.y)
       
   292 \end{ttbox}
       
   293 \caption{Rules for the sum type $\sum@{x\in A}B[x]$} \label{ctt-sum}
       
   294 \end{figure}
       
   295 
       
   296 
       
   297 \begin{figure} 
       
   298 \begin{ttbox}
       
   299 \idx{PlusF}       [| A type;  B type |] ==> A+B type
       
   300 \idx{PlusFL}      [| A = C;  B = D |] ==> A+B = C+D
       
   301 
       
   302 \idx{PlusI_inl}   [| a : A;  B type |] ==> inl(a) : A+B
       
   303 \idx{PlusI_inlL}  [| a = c : A;  B type |] ==> inl(a) = inl(c) : A+B
       
   304 
       
   305 \idx{PlusI_inr}   [| A type;  b : B |] ==> inr(b) : A+B
       
   306 \idx{PlusI_inrL}  [| A type;  b = d : B |] ==> inr(b) = inr(d) : A+B
       
   307 
       
   308 \idx{PlusE}     [| p: A+B;
       
   309              !!x. x:A ==> c(x): C(inl(x));  
       
   310              !!y. y:B ==> d(y): C(inr(y))
       
   311           |] ==> when(p, %x.c(x), %y.d(y)) : C(p)
       
   312 
       
   313 \idx{PlusEL}    [| p = q : A+B;
       
   314              !!x. x: A ==> c(x) = e(x) : C(inl(x));   
       
   315              !!y. y: B ==> d(y) = f(y) : C(inr(y))
       
   316           |] ==> when(p, %x.c(x), %y.d(y)) = 
       
   317                  when(q, %x.e(x), %y.f(y)) : C(p)
       
   318 
       
   319 \idx{PlusC_inl} [| a: A;
       
   320              !!x. x:A ==> c(x): C(inl(x));  
       
   321              !!y. y:B ==> d(y): C(inr(y))
       
   322           |] ==> when(inl(a), %x.c(x), %y.d(y)) = c(a) : C(inl(a))
       
   323 
       
   324 \idx{PlusC_inr} [| b: B;
       
   325              !!x. x:A ==> c(x): C(inl(x));  
       
   326              !!y. y:B ==> d(y): C(inr(y))
       
   327           |] ==> when(inr(b), %x.c(x), %y.d(y)) = d(b) : C(inr(b))
       
   328 \end{ttbox}
       
   329 \caption{Rules for the binary sum type $A+B$} \label{ctt-plus}
       
   330 \end{figure}
       
   331 
       
   332 
       
   333 \begin{figure} 
       
   334 \begin{ttbox}
       
   335 \idx{EqF}       [| A type;  a : A;  b : A |] ==> Eq(A,a,b) type
       
   336 \idx{EqFL}      [| A=B;  a=c: A;  b=d : A |] ==> Eq(A,a,b) = Eq(B,c,d)
       
   337 \idx{EqI}       a = b : A ==> eq : Eq(A,a,b)
       
   338 \idx{EqE}       p : Eq(A,a,b) ==> a = b : A
       
   339 \idx{EqC}       p : Eq(A,a,b) ==> p = eq : Eq(A,a,b)
       
   340 \end{ttbox}
       
   341 \subcaption{The equality type $Eq(A,a,b)$} 
       
   342 
       
   343 \begin{ttbox}
       
   344 \idx{FF}        F type
       
   345 \idx{FE}        [| p: F;  C type |] ==> contr(p) : C
       
   346 \idx{FEL}       [| p = q : F;  C type |] ==> contr(p) = contr(q) : C
       
   347 \end{ttbox}
       
   348 \subcaption{The empty type $F$} 
       
   349 
       
   350 \begin{ttbox}
       
   351 \idx{TF}        T type
       
   352 \idx{TI}        tt : T
       
   353 \idx{TE}        [| p : T;  c : C(tt) |] ==> c : C(p)
       
   354 \idx{TEL}       [| p = q : T;  c = d : C(tt) |] ==> c = d : C(p)
       
   355 \idx{TC}        p : T ==> p = tt : T)
       
   356 \end{ttbox}
       
   357 \subcaption{The unit type $T$} 
       
   358 
       
   359 \caption{Rules for other {\CTT} types} \label{ctt-others}
       
   360 \end{figure}
       
   361 
       
   362 
       
   363 
       
   364 \begin{figure} 
       
   365 \begin{ttbox}
       
   366 \idx{replace_type}    [| B = A;  a : A |] ==> a : B
       
   367 \idx{subst_eqtyparg}  [| a=c : A;  !!z. z:A ==> B(z) type |] ==> B(a)=B(c)
       
   368 
       
   369 \idx{subst_prodE}     [| p: Prod(A,B);  a: A;  !!z. z: B(a) ==> c(z): C(z)
       
   370                 |] ==> c(p`a): C(p`a)
       
   371 
       
   372 \idx{SumIL2}    [| c=a : A;  d=b : B(a) |] ==> <c,d> = <a,b> : Sum(A,B)
       
   373 
       
   374 \idx{SumE_fst}  p : Sum(A,B) ==> fst(p) : A
       
   375 
       
   376 \idx{SumE_snd}  [| p: Sum(A,B);  A type;  !!x. x:A ==> B(x) type
       
   377           |] ==> snd(p) : B(fst(p))
       
   378 \end{ttbox}
       
   379 
       
   380 \caption{Derived rules for {\CTT}} \label{ctt-derived}
       
   381 \end{figure}
       
   382 
       
   383 
       
   384 \section{Rules of inference}
       
   385 The rules obey the following naming conventions.  Type formation rules have
       
   386 the suffix~{\tt F}\@.  Introduction rules have the suffix~{\tt I}\@.
       
   387 Elimination rules have the suffix~{\tt E}\@.  Computation rules, which
       
   388 describe the reduction of eliminators, have the suffix~{\tt C}\@.  The
       
   389 equality versions of the rules (which permit reductions on subterms) are
       
   390 called {\em long} rules; their names have the suffix~{\tt L}\@.
       
   391 Introduction and computation rules often are further suffixed with
       
   392 constructor names.
       
   393 
       
   394 Figures~\ref{ctt-equality}--\ref{ctt-others} shows the rules.  Those
       
   395 for~$N$ include \ttindex{zero_ne_succ}, $0\not=n+1$: the fourth Peano axiom
       
   396 cannot be derived without universes \cite[page 91]{martinlof84}.
       
   397 Figure~\ref{ctt-sum} shows the rules for general sums, which include binary
       
   398 products as a special case, with the projections \ttindex{fst}
       
   399 and~\ttindex{snd}.
       
   400 
       
   401 The extra judgement \ttindex{Reduce} is used to implement rewriting.  The
       
   402 judgement ${\tt Reduce}(a,b)$ holds when $a=b:A$ holds.  It also holds
       
   403 when $a$ and $b$ are syntactically identical, even if they are ill-typed,
       
   404 because rule \ttindex{refl_red} does not verify that $a$ belongs to $A$.  These
       
   405 rules do not give rise to new theorems about the standard judgements ---
       
   406 note that the only rule that makes use of {\tt Reduce} is \ttindex{trans_red},
       
   407 whose first premise ensures that $a$ and $b$ (and thus $c$) are well-typed.
       
   408 
       
   409 Derived rules are shown in Figure~\ref{ctt-derived}.  The rule
       
   410 \ttindex{subst_prodE} is derived from \ttindex{prodE}, and is easier to
       
   411 use in backwards proof.  The rules \ttindex{SumE_fst} and
       
   412 \ttindex{SumE_snd} express the typing of~\ttindex{fst} and~\ttindex{snd};
       
   413 together, they are roughly equivalent to~\ttindex{SumE} with the advantage
       
   414 of creating no parameters.  These rules are demonstrated in a proof of the
       
   415 Axiom of Choice~(\S\ref{ctt-choice}).
       
   416 
       
   417 All the rules are given in $\eta$-expanded form.  For instance, every
       
   418 occurrence of $\lambda u\,v.b(u,v)$ could be abbreviated to~$b$ in the
       
   419 rules for~$N$.  This permits Isabelle to preserve bound variable names
       
   420 during backward proof.  Names of bound variables in the conclusion (here,
       
   421 $u$ and~$v$) are matched with corresponding bound variables in the premises.
       
   422 
       
   423 
       
   424 \section{Rule lists}
       
   425 The Type Theory tactics provide rewriting, type inference, and logical
       
   426 reasoning.  Many proof procedures work by repeatedly resolving certain Type
       
   427 Theory rules against a proof state.  {\CTT} defines lists --- each with
       
   428 type
       
   429 \hbox{\tt thm list} --- of related rules. 
       
   430 \begin{description}
       
   431 \item[\ttindexbold{form_rls}] 
       
   432 contains formation rules for the types $N$, $\Pi$, $\Sigma$, $+$, $Eq$,
       
   433 $F$, and $T$.
       
   434 
       
   435 \item[\ttindexbold{formL_rls}] 
       
   436 contains long formation rules for $\Pi$, $\Sigma$, $+$, and $Eq$.  (For
       
   437 other types use \ttindex{refl_type}.)
       
   438 
       
   439 \item[\ttindexbold{intr_rls}] 
       
   440 contains introduction rules for the types $N$, $\Pi$, $\Sigma$, $+$, and
       
   441 $T$.
       
   442 
       
   443 \item[\ttindexbold{intrL_rls}] 
       
   444 contains long introduction rules for $N$, $\Pi$, $\Sigma$, and $+$.  (For
       
   445 $T$ use \ttindex{refl_elem}.)
       
   446 
       
   447 \item[\ttindexbold{elim_rls}] 
       
   448 contains elimination rules for the types $N$, $\Pi$, $\Sigma$, $+$, and
       
   449 $F$.  The rules for $Eq$ and $T$ are omitted because they involve no
       
   450 eliminator.
       
   451 
       
   452 \item[\ttindexbold{elimL_rls}] 
       
   453 contains long elimination rules for $N$, $\Pi$, $\Sigma$, $+$, and $F$.
       
   454 
       
   455 \item[\ttindexbold{comp_rls}] 
       
   456 contains computation rules for the types $N$, $\Pi$, $\Sigma$, and $+$.
       
   457 Those for $Eq$ and $T$ involve no eliminator.
       
   458 
       
   459 \item[\ttindexbold{basic_defs}] 
       
   460 contains the definitions of \ttindex{fst} and \ttindex{snd}.  
       
   461 \end{description}
       
   462 
       
   463 
       
   464 \section{Tactics for subgoal reordering}
       
   465 \begin{ttbox}
       
   466 test_assume_tac : int -> tactic
       
   467 typechk_tac     : thm list -> tactic
       
   468 equal_tac       : thm list -> tactic
       
   469 intr_tac        : thm list -> tactic
       
   470 \end{ttbox}
       
   471 Blind application of {\CTT} rules seldom leads to a proof.  The elimination
       
   472 rules, especially, create subgoals containing new unknowns.  These subgoals
       
   473 unify with anything, causing an undirectional search.  The standard tactic
       
   474 \ttindex{filt_resolve_tac} (see the {\em Reference Manual}) can reject
       
   475 overly flexible goals; so does the {\CTT} tactic {\tt test_assume_tac}.
       
   476 Used with the tactical \ttindex{REPEAT_FIRST} they achieve a simple kind of
       
   477 subgoal reordering: the less flexible subgoals are attempted first.  Do
       
   478 some single step proofs, or study the examples below, to see why this is
       
   479 necessary.
       
   480 \begin{description}
       
   481 \item[\ttindexbold{test_assume_tac} $i$] 
       
   482 uses \ttindex{assume_tac} to solve the subgoal by assumption, but only if
       
   483 subgoal~$i$ has the form $a\in A$ and the head of $a$ is not an unknown.
       
   484 Otherwise, it fails.
       
   485 
       
   486 \item[\ttindexbold{typechk_tac} $thms$] 
       
   487 uses $thms$ with formation, introduction, and elimination rules to check
       
   488 the typing of constructions.  It is designed to solve goals of the form
       
   489 $a\in \Var{A}$, where $a$ is rigid and $\Var{A}$ is flexible.  Thus it
       
   490 performs Hindley-Milner type inference.  The tactic can also solve goals of
       
   491 the form $A\;\rm type$.
       
   492 
       
   493 \item[\ttindexbold{equal_tac} $thms$]
       
   494 uses $thms$ with the long introduction and elimination rules to solve goals
       
   495 of the form $a=b\in A$, where $a$ is rigid.  It is intended for deriving
       
   496 the long rules for defined constants such as the arithmetic operators.  The
       
   497 tactic can also perform type checking.
       
   498 
       
   499 \item[\ttindexbold{intr_tac} $thms$]
       
   500 uses $thms$ with the introduction rules to break down a type.  It is
       
   501 designed for goals like $\Var{a}\in A$ where $\Var{a}$ is flexible and $A$
       
   502 rigid.  These typically arise when trying to prove a proposition~$A$,
       
   503 expressed as a type.
       
   504 \end{description}
       
   505 
       
   506 
       
   507 
       
   508 \section{Rewriting tactics}
       
   509 \begin{ttbox}
       
   510 rew_tac     : thm list -> tactic
       
   511 hyp_rew_tac : thm list -> tactic
       
   512 \end{ttbox}
       
   513 Object-level simplification is accomplished through proof, using the {\tt
       
   514 CTT} equality rules and the built-in rewriting functor
       
   515 \ttindex{TSimpFun}.\footnote{This should not be confused with {\tt
       
   516 SimpFun}, which is the main rewriting functor; {\tt TSimpFun} is only
       
   517 useful for {\CTT} and similar logics with type inference rules.}
       
   518 The rewrites include the computation rules and other equations.  The
       
   519 long versions of the other rules permit rewriting of subterms and subtypes.
       
   520 Also used are transitivity and the extra judgement form \ttindex{Reduce}.
       
   521 Meta-level simplification handles only definitional equality.
       
   522 \begin{description}
       
   523 \item[\ttindexbold{rew_tac} $thms$]
       
   524 applies $thms$ and the computation rules as left-to-right rewrites.  It
       
   525 solves the goal $a=b\in A$ by rewriting $a$ to $b$.  If $b$ is an unknown
       
   526 then it is assigned the rewritten form of~$a$.  All subgoals are rewritten.
       
   527 
       
   528 \item[\ttindexbold{hyp_rew_tac} $thms$]
       
   529 is like {\tt rew_tac}, but includes as rewrites any equations present in
       
   530 the assumptions.
       
   531 \end{description}
       
   532 
       
   533 
       
   534 \section{Tactics for logical reasoning}
       
   535 Interpreting propositions as types lets {\CTT} express statements of
       
   536 intuitionistic logic.  However, Constructive Type Theory is not just
       
   537 another syntax for first-order logic. A key question: can assumptions be
       
   538 deleted after use?  Not every occurrence of a type represents a
       
   539 proposition, and Type Theory assumptions declare variables.  
       
   540 
       
   541 In first-order logic, $\disj$-elimination with the assumption $P\disj Q$
       
   542 creates one subgoal assuming $P$ and another assuming $Q$, and $P\disj Q$
       
   543 can be deleted.  In Type Theory, $+$-elimination with the assumption $z\in
       
   544 A+B$ creates one subgoal assuming $x\in A$ and another assuming $y\in B$
       
   545 (for arbitrary $x$ and $y$).  Deleting $z\in A+B$ may render the subgoals
       
   546 unprovable if other assumptions refer to $z$.  Some people might argue that
       
   547 such subgoals are not even meaningful.
       
   548 \begin{ttbox}
       
   549 mp_tac       : int -> tactic
       
   550 add_mp_tac   : int -> tactic
       
   551 safestep_tac : thm list -> int -> tactic
       
   552 safe_tac     : thm list -> int -> tactic
       
   553 step_tac     : thm list -> int -> tactic
       
   554 pc_tac       : thm list -> int -> tactic
       
   555 \end{ttbox}
       
   556 These are loosely based on the intuitionistic proof procedures
       
   557 of~\ttindex{FOL}.  For the reasons discussed above, a rule that is safe for
       
   558 propositional reasoning may be unsafe for type checking; thus, some of the
       
   559 ``safe'' tactics are misnamed.
       
   560 \begin{description}
       
   561 \item[\ttindexbold{mp_tac} $i$] 
       
   562 searches in subgoal~$i$ for assumptions of the form $f\in\Pi(A,B)$ and
       
   563 $a\in A$, where~$A$ may be found by unification.  It replaces
       
   564 $f\in\Pi(A,B)$ by $z\in B(a)$, where~$z$ is a new parameter.  The tactic
       
   565 can produce multiple outcomes for each suitable pair of assumptions.  In
       
   566 short, {\tt mp_tac} performs Modus Ponens among the assumptions.
       
   567 
       
   568 \item[\ttindexbold{add_mp_tac} $i$]
       
   569 is like {\tt mp_tac}~$i$ but retains the assumption $f\in\Pi(A,B)$.
       
   570 
       
   571 \item[\ttindexbold{safestep_tac} $thms$ $i$]
       
   572 attacks subgoal~$i$ using formation rules and certain other `safe' rules
       
   573 (\ttindex{FE}, \ttindex{ProdI}, \ttindex{SumE}, \ttindex{PlusE}), calling
       
   574 {\tt mp_tac} when appropriate.  It also uses~$thms$,
       
   575 which are typically premises of the rule being derived.
       
   576 
       
   577 \item[\ttindexbold{safe_tac} $thms$ $i$]
       
   578 tries to solve subgoal~$i$ by backtracking, using {\tt safestep_tac}.
       
   579 
       
   580 \item[\ttindexbold{step_tac} $thms$ $i$]
       
   581 tries to reduce subgoal~$i$ using {\tt safestep_tac}, then tries unsafe
       
   582 rules.  It may produce multiple outcomes.
       
   583 
       
   584 \item[\ttindexbold{pc_tac} $thms$ $i$]
       
   585 tries to solve subgoal~$i$ by backtracking, using {\tt step_tac}.
       
   586 \end{description}
       
   587 
       
   588 
       
   589 
       
   590 \begin{figure} 
       
   591 \begin{ttbox}
       
   592 \idx{add_def}           a#+b  == rec(a, b, %u v.succ(v))  
       
   593 \idx{diff_def}          a-b   == rec(b, a, %u v.rec(v, 0, %x y.x))  
       
   594 \idx{absdiff_def}       a|-|b == (a-b) #+ (b-a)  
       
   595 \idx{mult_def}          a#*b  == rec(a, 0, %u v. b #+ v)  
       
   596 
       
   597 \idx{mod_def}   a//b == rec(a, 0,
       
   598                       %u v. rec(succ(v) |-| b, 0, %x y.succ(v)))  
       
   599 
       
   600 \idx{quo_def}   a/b == rec(a, 0,
       
   601                       %u v. rec(succ(u) // b, succ(v), %x y.v))
       
   602 \end{ttbox}
       
   603 \subcaption{Definitions of the operators}
       
   604 
       
   605 \begin{ttbox}
       
   606 \idx{add_typing}        [| a:N;  b:N |] ==> a #+ b : N
       
   607 \idx{addC0}             b:N ==> 0 #+ b = b : N
       
   608 \idx{addC_succ}         [| a:N;  b:N |] ==> succ(a) #+ b = succ(a #+ b) : N
       
   609 
       
   610 \idx{add_assoc}         [| a:N;  b:N;  c:N |] ==> 
       
   611                   (a #+ b) #+ c = a #+ (b #+ c) : N
       
   612 
       
   613 \idx{add_commute}       [| a:N;  b:N |] ==> a #+ b = b #+ a : N
       
   614 
       
   615 \idx{mult_typing}       [| a:N;  b:N |] ==> a #* b : N
       
   616 \idx{multC0}            b:N ==> 0 #* b = 0 : N
       
   617 \idx{multC_succ}        [| a:N;  b:N |] ==> succ(a) #* b = b #+ (a#*b) : N
       
   618 \idx{mult_commute}      [| a:N;  b:N |] ==> a #* b = b #* a : N
       
   619 
       
   620 \idx{add_mult_dist}     [| a:N;  b:N;  c:N |] ==> 
       
   621                   (a #+ b) #* c = (a #* c) #+ (b #* c) : N
       
   622 
       
   623 \idx{mult_assoc}        [| a:N;  b:N;  c:N |] ==> 
       
   624                   (a #* b) #* c = a #* (b #* c) : N
       
   625 
       
   626 \idx{diff_typing}       [| a:N;  b:N |] ==> a - b : N
       
   627 \idx{diffC0}            a:N ==> a - 0 = a : N
       
   628 \idx{diff_0_eq_0}       b:N ==> 0 - b = 0 : N
       
   629 \idx{diff_succ_succ}    [| a:N;  b:N |] ==> succ(a) - succ(b) = a - b : N
       
   630 \idx{diff_self_eq_0}    a:N ==> a - a = 0 : N
       
   631 \idx{add_inverse_diff}  [| a:N;  b:N;  b-a=0 : N |] ==> b #+ (a-b) = a : N
       
   632 \end{ttbox}
       
   633 \subcaption{Some theorems of arithmetic}
       
   634 \caption{The theory of arithmetic} \label{ctt-arith}
       
   635 \end{figure}
       
   636 
       
   637 
       
   638 \section{A theory of arithmetic}
       
   639 {\CTT} contains a theory of elementary arithmetic.  It proves the
       
   640 properties of addition, multiplication, subtraction, division, and
       
   641 remainder, culminating in the theorem
       
   642 \[ a \bmod b + (a/b)\times b = a. \]
       
   643 Figure~\ref{ctt-arith} presents the definitions and some of the key
       
   644 theorems, including commutative, distributive, and associative laws.  The
       
   645 theory has the {\ML} identifier \ttindexbold{arith.thy}.  All proofs are on
       
   646 the file \ttindexbold{CTT/arith.ML}.
       
   647 
       
   648 The operators~\verb'#+', \verb'-', \verb'|-|', \verb'#*', \verb'//'
       
   649 and~\verb'/' stand for sum, difference, absolute difference, product,
       
   650 remainder and quotient, respectively.  Since Type Theory has only primitive
       
   651 recursion, some of their definitions may be obscure.  
       
   652 
       
   653 The difference~$a-b$ is computed by taking $b$ predecessors of~$a$, where
       
   654 the predecessor function is $\lambda v. {\tt rec}(v, 0, \lambda x\,y.x)$.
       
   655 
       
   656 The remainder $a//b$ counts up to~$a$ in a cyclic fashion, using 0 as the
       
   657 successor of~$b-1$.  Absolute difference is used to test the equality
       
   658 $succ(v)=b$.
       
   659 
       
   660 The quotient $a//b$ is computed by adding one for every number $x$ such
       
   661 that $0\leq x \leq a$ and $x//b = 0$.
       
   662 
       
   663 
       
   664 
       
   665 \section{The examples directory}
       
   666 This directory contains examples and experimental proofs in {\CTT}.
       
   667 \begin{description}
       
   668 \item[\ttindexbold{CTT/ex/typechk.ML}]
       
   669 contains simple examples of type checking and type deduction.
       
   670 
       
   671 \item[\ttindexbold{CTT/ex/elim.ML}]
       
   672 contains some examples from Martin-L\"of~\cite{martinlof84}, proved using 
       
   673 {\tt pc_tac}.
       
   674 
       
   675 \item[\ttindexbold{CTT/ex/equal.ML}]
       
   676 contains simple examples of rewriting.
       
   677 
       
   678 \item[\ttindexbold{CTT/ex/synth.ML}]
       
   679 demonstrates the use of unknowns with some trivial examples of program
       
   680 synthesis. 
       
   681 \end{description}
       
   682 
       
   683 
       
   684 \section{Example: type inference}
       
   685 Type inference involves proving a goal of the form $a\in\Var{A}$, where $a$
       
   686 is a term and $\Var{A}$ is an unknown standing for its type.  The type,
       
   687 initially
       
   688 unknown, takes shape in the course of the proof.  Our example is the
       
   689 predecessor function on the natural numbers.
       
   690 \begin{ttbox}
       
   691 goal CTT.thy "lam n. rec(n, 0, %x y.x) : ?A";
       
   692 {\out Level 0}
       
   693 {\out lam n. rec(n,0,%x y. x) : ?A}
       
   694 {\out  1. lam n. rec(n,0,%x y. x) : ?A}
       
   695 \end{ttbox}
       
   696 Since the term is a Constructive Type Theory $\lambda$-abstraction (not to
       
   697 be confused with a meta-level abstraction), we apply the rule
       
   698 \ttindex{ProdI}, for $\Pi$-introduction.  This instantiates~$\Var{A}$ to a
       
   699 product type of unknown domain and range.
       
   700 \begin{ttbox}
       
   701 by (resolve_tac [ProdI] 1);
       
   702 {\out Level 1}
       
   703 {\out lam n. rec(n,0,%x y. x) : PROD x:?A1. ?B1(x)}
       
   704 {\out  1. ?A1 type}
       
   705 {\out  2. !!n. n : ?A1 ==> rec(n,0,%x y. x) : ?B1(n)}
       
   706 \end{ttbox}
       
   707 Subgoal~1 can be solved by instantiating~$\Var{A@1}$ to any type, but this
       
   708 could invalidate subgoal~2.  We therefore tackle the latter subgoal.  It
       
   709 asks the type of a term beginning with {\tt rec}, which can be found by
       
   710 $N$-elimination.\index{*NE}
       
   711 \begin{ttbox}
       
   712 by (eresolve_tac [NE] 2);
       
   713 {\out Level 2}
       
   714 {\out lam n. rec(n,0,%x y. x) : PROD x:N. ?C2(x,x)}
       
   715 {\out  1. N type}
       
   716 {\out  2. !!n. 0 : ?C2(n,0)}
       
   717 {\out  3. !!n x y. [| x : N; y : ?C2(n,x) |] ==> x : ?C2(n,succ(x))}
       
   718 \end{ttbox}
       
   719 We now know~$\Var{A@1}$ is the type of natural numbers.  However, let us
       
   720 continue with subgoal~2.  What is the type of~0?\index{*NIO}
       
   721 \begin{ttbox}
       
   722 by (resolve_tac [NI0] 2);
       
   723 {\out Level 3}
       
   724 {\out lam n. rec(n,0,%x y. x) : N --> N}
       
   725 {\out  1. N type}
       
   726 {\out  2. !!n x y. [| x : N; y : N |] ==> x : N}
       
   727 \end{ttbox}
       
   728 The type~$\Var{A}$ is now determined.  It is $\prod@{n\in N}N$, which is
       
   729 equivalent to $N\to N$.  But we must prove all the subgoals to show that
       
   730 the original term is validly typed.  Subgoal~2 is provable by assumption
       
   731 and the remaining subgoal falls by $N$-formation.\index{*NF}
       
   732 \begin{ttbox}
       
   733 by (assume_tac 2);
       
   734 {\out Level 4}
       
   735 {\out lam n. rec(n,0,%x y. x) : N --> N}
       
   736 {\out  1. N type}
       
   737 by (resolve_tac [NF] 1);
       
   738 {\out Level 5}
       
   739 {\out lam n. rec(n,0,%x y. x) : N --> N}
       
   740 {\out No subgoals!}
       
   741 \end{ttbox}
       
   742 Calling \ttindex{typechk_tac} can prove this theorem in one step.
       
   743 
       
   744 
       
   745 \section{An example of logical reasoning}
       
   746 Logical reasoning in Type Theory involves proving a goal of the form
       
   747 $\Var{a}\in A$, where type $A$ expresses a proposition and $\Var{a}$ is an
       
   748 unknown standing
       
   749 for its proof term: a value of type $A$. This term is initially unknown, as
       
   750 with type inference, and takes shape during the proof.  Our example
       
   751 expresses, by propositions-as-types, a theorem about quantifiers in a
       
   752 sorted logic:
       
   753 \[ \infer{(\ex{x\in A}P(x)) \disj (\ex{x\in A}Q(x))}
       
   754          {\ex{x\in A}P(x)\disj Q(x)} 
       
   755 \]
       
   756 It it related to a distributive law of Type Theory:
       
   757 \[ \infer{(A\times B) + (A\times C)}{A\times(B+C)} \]
       
   758 Generalizing this from $\times$ to $\Sigma$, and making the typing
       
   759 conditions explicit, yields
       
   760 \[ \infer{\Var{a} \in (\sum@{x\in A} B(x)) + (\sum@{x\in A} C(x))}
       
   761          {\hbox{$A$ type} &
       
   762           \infer*{\hbox{$B(x)$ type}}{[x\in A]}  &
       
   763           \infer*{\hbox{$C(x)$ type}}{[x\in A]}  &
       
   764           p\in \sum@{x\in A} B(x)+C(x)} 
       
   765 \]
       
   766 To derive this rule, we bind its premises --- returned by~\ttindex{goal}
       
   767 --- to the {\ML} variable~{\tt prems}.
       
   768 \begin{ttbox}
       
   769 val prems = goal CTT.thy
       
   770     "[| A type;                       \ttback
       
   771 \ttback       !!x. x:A ==> B(x) type;       \ttback
       
   772 \ttback       !!x. x:A ==> C(x) type;       \ttback
       
   773 \ttback       p: SUM x:A. B(x) + C(x)       \ttback
       
   774 \ttback    |] ==>  ?a : (SUM x:A. B(x)) + (SUM x:A. C(x))";
       
   775 {\out Level 0}
       
   776 {\out ?a : (SUM x:A. B(x)) + (SUM x:A. C(x))}
       
   777 {\out  1. ?a : (SUM x:A. B(x)) + (SUM x:A. C(x))}
       
   778 \end{ttbox}
       
   779 One of the premises involves summation ($\Sigma$).  Since it is a premise
       
   780 rather than the assumption of a goal, it cannot be found by
       
   781 \ttindex{eresolve_tac}.  We could insert it by calling
       
   782 \hbox{\tt \ttindex{cut_facts_tac} prems 1}.   Instead, let us resolve the
       
   783 $\Sigma$-elimination rule with the premises; this yields one result, which
       
   784 we supply to \ttindex{resolve_tac}.\index{*SumE}\index{*RL}
       
   785 \begin{ttbox}
       
   786 by (resolve_tac (prems RL [SumE]) 1);
       
   787 {\out Level 1}
       
   788 {\out split(p,?c1) : (SUM x:A. B(x)) + (SUM x:A. C(x))}
       
   789 {\out  1. !!x y.}
       
   790 {\out        [| x : A; y : B(x) + C(x) |] ==>}
       
   791 {\out        ?c1(x,y) : (SUM x:A. B(x)) + (SUM x:A. C(x))}
       
   792 \end{ttbox}
       
   793 The subgoal has two new parameters.  In the main goal, $\Var{a}$ has been
       
   794 instantiated with a \ttindex{split} term.  The assumption $y\in B(x) + C(x)$ is
       
   795 eliminated next, causing a case split and a new parameter.  The main goal
       
   796 now contains~\ttindex{when}.
       
   797 \index{*PlusE}
       
   798 \begin{ttbox}
       
   799 by (eresolve_tac [PlusE] 1);
       
   800 {\out Level 2}
       
   801 {\out split(p,%x y. when(y,?c2(x,y),?d2(x,y)))}
       
   802 {\out : (SUM x:A. B(x)) + (SUM x:A. C(x))}
       
   803 {\out  1. !!x y xa.}
       
   804 {\out        [| x : A; xa : B(x) |] ==>}
       
   805 {\out        ?c2(x,y,xa) : (SUM x:A. B(x)) + (SUM x:A. C(x))}
       
   806 {\out  2. !!x y ya.}
       
   807 {\out        [| x : A; ya : C(x) |] ==>}
       
   808 {\out        ?d2(x,y,ya) : (SUM x:A. B(x)) + (SUM x:A. C(x))}
       
   809 \end{ttbox}
       
   810 To complete the proof object for the main goal, we need to instantiate the
       
   811 terms $\Var{c@2}(x,y,xa)$ and $\Var{d@2}(x,y,xa)$.  We attack subgoal~1 by
       
   812 introduction of~$+$; since it assumes $xa\in B(x)$, we take the left
       
   813 injection~(\ttindex{inl}).
       
   814 \index{*PlusI_inl}
       
   815 \begin{ttbox}
       
   816 by (resolve_tac [PlusI_inl] 1);
       
   817 {\out Level 3}
       
   818 {\out split(p,%x y. when(y,%xa. inl(?a3(x,y,xa)),?d2(x,y)))}
       
   819 {\out : (SUM x:A. B(x)) + (SUM x:A. C(x))}
       
   820 {\out  1. !!x y xa. [| x : A; xa : B(x) |] ==> ?a3(x,y,xa) : SUM x:A. B(x)}
       
   821 {\out  2. !!x y xa. [| x : A; xa : B(x) |] ==> SUM x:A. C(x) type}
       
   822 {\out  3. !!x y ya.}
       
   823 {\out        [| x : A; ya : C(x) |] ==>}
       
   824 {\out        ?d2(x,y,ya) : (SUM x:A. B(x)) + (SUM x:A. C(x))}
       
   825 \end{ttbox}
       
   826 A new subgoal has appeared, to verify that $\sum@{x\in A}C(x)$ is a type.
       
   827 Continuing with subgoal~1, we apply $\Sigma$-introduction.  The main goal
       
   828 now contains an ordered pair.
       
   829 \index{*SumI}
       
   830 \begin{ttbox}
       
   831 by (resolve_tac [SumI] 1);
       
   832 {\out Level 4}
       
   833 {\out split(p,%x y. when(y,%xa. inl(<?a4(x,y,xa),?b4(x,y,xa)>),?d2(x,y)))}
       
   834 {\out : (SUM x:A. B(x)) + (SUM x:A. C(x))}
       
   835 {\out  1. !!x y xa. [| x : A; xa : B(x) |] ==> ?a4(x,y,xa) : A}
       
   836 {\out  2. !!x y xa. [| x : A; xa : B(x) |] ==> ?b4(x,y,xa) : B(?a4(x,y,xa))}
       
   837 {\out  3. !!x y xa. [| x : A; xa : B(x) |] ==> SUM x:A. C(x) type}
       
   838 {\out  4. !!x y ya.}
       
   839 {\out        [| x : A; ya : C(x) |] ==>}
       
   840 {\out        ?d2(x,y,ya) : (SUM x:A. B(x)) + (SUM x:A. C(x))}
       
   841 \end{ttbox}
       
   842 The two new subgoals both hold by assumption.  Observe how the unknowns
       
   843 $\Var{a@4}$ and $\Var{b@4}$ are instantiated throughout the proof state.
       
   844 \begin{ttbox}
       
   845 by (assume_tac 1);
       
   846 {\out Level 5}
       
   847 {\out split(p,%x y. when(y,%xa. inl(<x,?b4(x,y,xa)>),?d2(x,y)))}
       
   848 {\out : (SUM x:A. B(x)) + (SUM x:A. C(x))}
       
   849 {\out  1. !!x y xa. [| x : A; xa : B(x) |] ==> ?b4(x,y,xa) : B(x)}
       
   850 {\out  2. !!x y xa. [| x : A; xa : B(x) |] ==> SUM x:A. C(x) type}
       
   851 {\out  3. !!x y ya.}
       
   852 {\out        [| x : A; ya : C(x) |] ==>}
       
   853 {\out        ?d2(x,y,ya) : (SUM x:A. B(x)) + (SUM x:A. C(x))}
       
   854 by (assume_tac 1);
       
   855 {\out Level 6}
       
   856 {\out split(p,%x y. when(y,%xa. inl(<x,xa>),?d2(x,y)))}
       
   857 {\out : (SUM x:A. B(x)) + (SUM x:A. C(x))}
       
   858 {\out  1. !!x y xa. [| x : A; xa : B(x) |] ==> SUM x:A. C(x) type}
       
   859 {\out  2. !!x y ya.}
       
   860 {\out        [| x : A; ya : C(x) |] ==>}
       
   861 {\out        ?d2(x,y,ya) : (SUM x:A. B(x)) + (SUM x:A. C(x))}
       
   862 \end{ttbox}
       
   863 Subgoal~1 is just type checking.  It yields to \ttindex{typechk_tac},
       
   864 supplied with the current list of premises.
       
   865 \begin{ttbox}
       
   866 by (typechk_tac prems);
       
   867 {\out Level 7}
       
   868 {\out split(p,%x y. when(y,%xa. inl(<x,xa>),?d2(x,y)))}
       
   869 {\out : (SUM x:A. B(x)) + (SUM x:A. C(x))}
       
   870 {\out  1. !!x y ya.}
       
   871 {\out        [| x : A; ya : C(x) |] ==>}
       
   872 {\out        ?d2(x,y,ya) : (SUM x:A. B(x)) + (SUM x:A. C(x))}
       
   873 \end{ttbox}
       
   874 The other case is similar.  Let us prove it by \ttindex{pc_tac}, and note
       
   875 the final proof object.
       
   876 \begin{ttbox}
       
   877 by (pc_tac prems 1);
       
   878 {\out Level 8}
       
   879 {\out split(p,%x y. when(y,%xa. inl(<x,xa>),%y. inr(<x,y>)))}
       
   880 {\out : (SUM x:A. B(x)) + (SUM x:A. C(x))}
       
   881 {\out No subgoals!}
       
   882 \end{ttbox}
       
   883 Calling \ttindex{pc_tac} after the first $\Sigma$-elimination above also
       
   884 proves this theorem.
       
   885 
       
   886 
       
   887 \section{Example: deriving a currying functional}
       
   888 In simply-typed languages such as {\ML}, a currying functional has the type 
       
   889 \[ (A\times B \to C) \to (A\to (B\to C)). \]
       
   890 Let us generalize this to~$\Sigma$ and~$\Pi$.  The argument of the
       
   891 functional is a function that maps $z:\Sigma(A,B)$ to~$C(z)$; the resulting
       
   892 function maps $x\in A$ and $y\in B(x)$ to $C(\langle x,y\rangle)$.  Here
       
   893 $B$ is a family over~$A$, while $C$ is a family over $\Sigma(A,B)$.
       
   894 \begin{ttbox}
       
   895 val prems = goal CTT.thy
       
   896     "[| A type; !!x. x:A ==> B(x) type;                    \ttback
       
   897 \ttback               !!z. z: (SUM x:A. B(x)) ==> C(z) type |]   \ttback
       
   898 \ttback    ==> ?a : (PROD z : (SUM x:A . B(x)) . C(z))           \ttback
       
   899 \ttback         --> (PROD x:A . PROD y:B(x) . C(<x,y>))";
       
   900 {\out Level 0}
       
   901 {\out ?a : (PROD z:SUM x:A. B(x). C(z)) --> (PROD x:A. PROD y:B(x). C(<x,y>))}
       
   902 {\out  1. ?a : (PROD z:SUM x:A. B(x). C(z)) -->}
       
   903 {\out          (PROD x:A. PROD y:B(x). C(<x,y>))}
       
   904 \end{ttbox}
       
   905 This is an opportunity to demonstrate \ttindex{intr_tac}.  Here, the tactic
       
   906 repeatedly applies $\Pi$-introduction, automatically proving the rather
       
   907 tiresome typing conditions.  Note that $\Var{a}$ becomes instantiated to
       
   908 three nested $\lambda$-abstractions.
       
   909 \begin{ttbox}
       
   910 by (intr_tac prems);
       
   911 {\out Level 1}
       
   912 {\out lam x xa xb. ?b7(x,xa,xb)}
       
   913 {\out : (PROD z:SUM x:A. B(x). C(z)) --> (PROD x:A. PROD y:B(x). C(<x,y>))}
       
   914 {\out  1. !!uu x y.}
       
   915 {\out        [| uu : PROD z:SUM x:A. B(x). C(z); x : A; y : B(x) |] ==>}
       
   916 {\out        ?b7(uu,x,y) : C(<x,y>)}
       
   917 \end{ttbox}
       
   918 Using $\Pi$-elimination, we solve subgoal~1 by applying the function~$uu$.
       
   919 \index{*ProdE}
       
   920 \begin{ttbox}
       
   921 by (eresolve_tac [ProdE] 1);
       
   922 {\out Level 2}
       
   923 {\out lam x xa xb. x ` <xa,xb>}
       
   924 {\out : (PROD z:SUM x:A. B(x). C(z)) --> (PROD x:A. PROD y:B(x). C(<x,y>))}
       
   925 {\out  1. !!uu x y. [| x : A; y : B(x) |] ==> <x,y> : SUM x:A. B(x)}
       
   926 \end{ttbox}
       
   927 Finally, we exhibit a suitable argument for the function application.  This
       
   928 is straightforward using introduction rules.
       
   929 \index{*intr_tac}
       
   930 \begin{ttbox}
       
   931 by (intr_tac prems);
       
   932 {\out Level 3}
       
   933 {\out lam x xa xb. x ` <xa,xb>}
       
   934 {\out : (PROD z:SUM x:A. B(x). C(z)) --> (PROD x:A. PROD y:B(x). C(<x,y>))}
       
   935 {\out No subgoals!}
       
   936 \end{ttbox}
       
   937 Calling~\ttindex{pc_tac} would have proved this theorem in one step; it can
       
   938 also prove an example by Martin-L\"of, related to $\disj$-elimination
       
   939 \cite[page~58]{martinlof84}.
       
   940 
       
   941 
       
   942 \section{Example: proving the Axiom of Choice} \label{ctt-choice}
       
   943 Suppose we have a function $h\in \prod@{x\in A}\sum@{y\in B(x)} C(x,y)$,
       
   944 which takes $x\in A$ to some $y\in B(x)$ paired with some $z\in C(x,y)$.
       
   945 Interpreting propositions as types, this asserts that for all $x\in A$
       
   946 there exists $y\in B(x)$ such that $C(x,y)$.  The Axiom of Choice asserts
       
   947 that we can construct a function $f\in \prod@{x\in A}B(x)$ such that
       
   948 $C(x,f{\tt`}x)$ for all $x\in A$, where the latter property is witnessed by a
       
   949 function $g\in \prod@{x\in A}C(x,f{\tt`}x)$.
       
   950 
       
   951 In principle, the Axiom of Choice is simple to derive in Constructive Type
       
   952 Theory \cite[page~50]{martinlof84}.  The following definitions work:
       
   953 \begin{eqnarray*}
       
   954     f & \equiv & {\tt fst} \circ h \\
       
   955     g & \equiv & {\tt snd} \circ h
       
   956 \end{eqnarray*}
       
   957 But a completely formal proof is hard to find.  Many of the rules can be
       
   958 applied in a multiplicity of ways, yielding a large number of higher-order
       
   959 unifiers.  The proof can get bogged down in the details.  But with a
       
   960 careful selection of derived rules (recall Figure~\ref{ctt-derived}) and
       
   961 the type checking tactics, we can prove the theorem in nine steps.
       
   962 \begin{ttbox}
       
   963 val prems = goal CTT.thy
       
   964     "[| A type;  !!x. x:A ==> B(x) type;              \ttback
       
   965 \ttback       !!x y.[| x:A;  y:B(x) |] ==> C(x,y) type      \ttback
       
   966 \ttback    |] ==> ?a :    (PROD x:A. SUM y:B(x). C(x,y))    \ttback
       
   967 \ttback               --> (SUM f: (PROD x:A. B(x)). PROD x:A. C(x, f`x))";
       
   968 {\out Level 0}
       
   969 {\out ?a : (PROD x:A. SUM y:B(x). C(x,y)) -->}
       
   970 {\out      (SUM f:PROD x:A. B(x). PROD x:A. C(x,f ` x))}
       
   971 {\out  1. ?a : (PROD x:A. SUM y:B(x). C(x,y)) -->}
       
   972 {\out          (SUM f:PROD x:A. B(x). PROD x:A. C(x,f ` x))}
       
   973 \end{ttbox}
       
   974 First, \ttindex{intr_tac} applies introduction rules and performs routine
       
   975 type checking.  This instantiates~$\Var{a}$ to a construction involving
       
   976 three $\lambda$-abstractions and an ordered pair.
       
   977 \begin{ttbox}
       
   978 by (intr_tac prems);
       
   979 {\out Level 1}
       
   980 {\out lam x. <lam xa. ?b7(x,xa),lam xa. ?b8(x,xa)>}
       
   981 {\out : (PROD x:A. SUM y:B(x). C(x,y)) -->}
       
   982 {\out   (SUM f:PROD x:A. B(x). PROD x:A. C(x,f ` x))}
       
   983 {\out  1. !!uu x.}
       
   984 {\out        [| uu : PROD x:A. SUM y:B(x). C(x,y); x : A |] ==>}
       
   985 {\out        ?b7(uu,x) : B(x)}
       
   986 {\out  2. !!uu x.}
       
   987 {\out        [| uu : PROD x:A. SUM y:B(x). C(x,y); x : A |] ==>}
       
   988 {\out        ?b8(uu,x) : C(x,(lam x. ?b7(uu,x)) ` x)}
       
   989 \end{ttbox}
       
   990 Subgoal~1 asks to find the choice function itself, taking $x\in A$ to some
       
   991 $\Var{b@7}(uu,x)\in B(x)$.  Subgoal~2 asks, given $x\in A$, for a proof
       
   992 object $\Var{b@8}(uu,x)$ to witness that the choice function's argument
       
   993 and result lie in the relation~$C$.  
       
   994 \index{*ProdE}\index{*SumE_fst}\index{*RS}
       
   995 \begin{ttbox}
       
   996 by (eresolve_tac [ProdE RS SumE_fst] 1);
       
   997 {\out Level 2}
       
   998 {\out lam x. <lam xa. fst(x ` xa),lam xa. ?b8(x,xa)>}
       
   999 {\out : (PROD x:A. SUM y:B(x). C(x,y)) -->}
       
  1000 {\out   (SUM f:PROD x:A. B(x). PROD x:A. C(x,f ` x))}
       
  1001 {\out  1. !!uu x. x : A ==> x : A}
       
  1002 {\out  2. !!uu x.}
       
  1003 {\out        [| uu : PROD x:A. SUM y:B(x). C(x,y); x : A |] ==>}
       
  1004 {\out        ?b8(uu,x) : C(x,(lam x. fst(uu ` x)) ` x)}
       
  1005 \end{ttbox}
       
  1006 Above, we have composed \ttindex{fst} with the function~$h$ (named~$uu$ in
       
  1007 the assumptions).  Unification has deduced that the function must be
       
  1008 applied to $x\in A$.
       
  1009 \begin{ttbox}
       
  1010 by (assume_tac 1);
       
  1011 {\out Level 3}
       
  1012 {\out lam x. <lam xa. fst(x ` xa),lam xa. ?b8(x,xa)>}
       
  1013 {\out : (PROD x:A. SUM y:B(x). C(x,y)) -->}
       
  1014 {\out   (SUM f:PROD x:A. B(x). PROD x:A. C(x,f ` x))}
       
  1015 {\out  1. !!uu x.}
       
  1016 {\out        [| uu : PROD x:A. SUM y:B(x). C(x,y); x : A |] ==>}
       
  1017 {\out        ?b8(uu,x) : C(x,(lam x. fst(uu ` x)) ` x)}
       
  1018 \end{ttbox}
       
  1019 Before we can compose \ttindex{snd} with~$h$, the arguments of $C$ must be
       
  1020 simplified.  The derived rule \ttindex{replace_type} lets us replace a type
       
  1021 by any equivalent type:
       
  1022 \begin{ttbox}
       
  1023 by (resolve_tac [replace_type] 1);
       
  1024 {\out Level 4}
       
  1025 {\out lam x. <lam xa. fst(x ` xa),lam xa. ?b8(x,xa)>}
       
  1026 {\out : (PROD x:A. SUM y:B(x). C(x,y)) -->}
       
  1027 {\out   (SUM f:PROD x:A. B(x). PROD x:A. C(x,f ` x))}
       
  1028 {\out  1. !!uu x.}
       
  1029 {\out        [| uu : PROD x:A. SUM y:B(x). C(x,y); x : A |] ==>}
       
  1030 {\out        C(x,(lam x. fst(uu ` x)) ` x) = ?A13(uu,x)}
       
  1031 {\out  2. !!uu x.}
       
  1032 {\out        [| uu : PROD x:A. SUM y:B(x). C(x,y); x : A |] ==>}
       
  1033 {\out        ?b8(uu,x) : ?A13(uu,x)}
       
  1034 \end{ttbox}
       
  1035 The derived rule \ttindex{subst_eqtyparg} lets us simplify a type's
       
  1036 argument (by currying, $C(x)$ is a unary type operator):
       
  1037 \begin{ttbox}
       
  1038 by (resolve_tac [subst_eqtyparg] 1);
       
  1039 {\out Level 5}
       
  1040 {\out lam x. <lam xa. fst(x ` xa),lam xa. ?b8(x,xa)>}
       
  1041 {\out : (PROD x:A. SUM y:B(x). C(x,y)) -->}
       
  1042 {\out   (SUM f:PROD x:A. B(x). PROD x:A. C(x,f ` x))}
       
  1043 {\out  1. !!uu x.}
       
  1044 {\out        [| uu : PROD x:A. SUM y:B(x). C(x,y); x : A |] ==>}
       
  1045 {\out        (lam x. fst(uu ` x)) ` x = ?c14(uu,x) : ?A14(uu,x)}
       
  1046 {\out  2. !!uu x z.}
       
  1047 {\out        [| uu : PROD x:A. SUM y:B(x). C(x,y); x : A;}
       
  1048 {\out           z : ?A14(uu,x) |] ==>}
       
  1049 {\out        C(x,z) type}
       
  1050 {\out  3. !!uu x.}
       
  1051 {\out        [| uu : PROD x:A. SUM y:B(x). C(x,y); x : A |] ==>}
       
  1052 {\out        ?b8(uu,x) : C(x,?c14(uu,x))}
       
  1053 \end{ttbox}
       
  1054 The rule \ttindex{ProdC} is simply $\beta$-reduction.  The term
       
  1055 $\Var{c@{14}}(uu,x)$ receives the simplified form, $f{\tt`}x$.
       
  1056 \begin{ttbox}
       
  1057 by (resolve_tac [ProdC] 1);
       
  1058 {\out Level 6}
       
  1059 {\out lam x. <lam xa. fst(x ` xa),lam xa. ?b8(x,xa)>}
       
  1060 {\out : (PROD x:A. SUM y:B(x). C(x,y)) -->}
       
  1061 {\out   (SUM f:PROD x:A. B(x). PROD x:A. C(x,f ` x))}
       
  1062 {\out  1. !!uu x.}
       
  1063 {\out        [| uu : PROD x:A. SUM y:B(x). C(x,y); x : A |] ==> x : ?A15(uu,x)}
       
  1064 {\out  2. !!uu x xa.}
       
  1065 {\out        [| uu : PROD x:A. SUM y:B(x). C(x,y); x : A;}
       
  1066 {\out           xa : ?A15(uu,x) |] ==>}
       
  1067 {\out        fst(uu ` xa) : ?B15(uu,x,xa)}
       
  1068 {\out  3. !!uu x z.}
       
  1069 {\out        [| uu : PROD x:A. SUM y:B(x). C(x,y); x : A;}
       
  1070 {\out           z : ?B15(uu,x,x) |] ==>}
       
  1071 {\out        C(x,z) type}
       
  1072 {\out  4. !!uu x.}
       
  1073 {\out        [| uu : PROD x:A. SUM y:B(x). C(x,y); x : A |] ==>}
       
  1074 {\out        ?b8(uu,x) : C(x,fst(uu ` x))}
       
  1075 \end{ttbox}
       
  1076 Routine type checking goals proliferate in Constructive Type Theory, but
       
  1077 \ttindex{typechk_tac} quickly solves them.  Note the inclusion of
       
  1078 \ttindex{SumE_fst}.
       
  1079 \begin{ttbox}
       
  1080 by (typechk_tac (SumE_fst::prems));
       
  1081 {\out Level 7}
       
  1082 {\out lam x. <lam xa. fst(x ` xa),lam xa. ?b8(x,xa)>}
       
  1083 {\out : (PROD x:A. SUM y:B(x). C(x,y)) -->}
       
  1084 {\out   (SUM f:PROD x:A. B(x). PROD x:A. C(x,f ` x))}
       
  1085 {\out  1. !!uu x.}
       
  1086 {\out        [| uu : PROD x:A. SUM y:B(x). C(x,y); x : A |] ==>}
       
  1087 {\out        ?b8(uu,x) : C(x,fst(uu ` x))}
       
  1088 \end{ttbox}
       
  1089 We are finally ready to compose \ttindex{snd} with~$h$.
       
  1090 \index{*ProdE}\index{*SumE_snd}\index{*RS}
       
  1091 \begin{ttbox}
       
  1092 by (eresolve_tac [ProdE RS SumE_snd] 1);
       
  1093 {\out Level 8}
       
  1094 {\out lam x. <lam xa. fst(x ` xa),lam xa. snd(x ` xa)>}
       
  1095 {\out : (PROD x:A. SUM y:B(x). C(x,y)) -->}
       
  1096 {\out   (SUM f:PROD x:A. B(x). PROD x:A. C(x,f ` x))}
       
  1097 {\out  1. !!uu x. x : A ==> x : A}
       
  1098 {\out  2. !!uu x. x : A ==> B(x) type}
       
  1099 {\out  3. !!uu x xa. [| x : A; xa : B(x) |] ==> C(x,xa) type}
       
  1100 \end{ttbox}
       
  1101 The proof object has reached its final form.  We call \ttindex{typechk_tac}
       
  1102 to finish the type checking.
       
  1103 \begin{ttbox}
       
  1104 by (typechk_tac prems);
       
  1105 {\out Level 9}
       
  1106 {\out lam x. <lam xa. fst(x ` xa),lam xa. snd(x ` xa)>}
       
  1107 {\out : (PROD x:A. SUM y:B(x). C(x,y)) -->}
       
  1108 {\out   (SUM f:PROD x:A. B(x). PROD x:A. C(x,f ` x))}
       
  1109 {\out No subgoals!}
       
  1110 \end{ttbox}