]> matita.cs.unibo.it Git - helm.git/blob - helm/papers/matita/matita.tex
ocaml 3.09 transition
[helm.git] / helm / papers / matita / matita.tex
1 \documentclass{kluwer}
2 \usepackage{color}
3 \usepackage{graphicx}
4 % \usepackage{amssymb,amsmath}
5 \usepackage{hyperref}
6 % \usepackage{picins}
7 \usepackage{color}
8 \usepackage{fancyvrb}
9 \usepackage[show]{ed}
10
11 \definecolor{gray}{gray}{0.85}
12 %\newcommand{\logo}[3]{
13 %\parpic(0cm,0cm)(#2,#3)[l]{\includegraphics[width=#1]{whelp-bw}}
14 %}
15
16 \newcommand{\AUTO}{\textsc{Auto}}
17 \newcommand{\COQ}{Coq}
18 \newcommand{\ELIM}{\textsc{Elim}}
19 \newcommand{\HELM}{Helm}
20 \newcommand{\HINT}{\textsc{Hint}}
21 \newcommand{\IN}{\ensuremath{\dN}}
22 \newcommand{\INSTANCE}{\textsc{Instance}}
23 \newcommand{\IR}{\ensuremath{\dR}}
24 \newcommand{\IZ}{\ensuremath{\dZ}}
25 \newcommand{\LIBXSLT}{LibXSLT}
26 \newcommand{\LOCATE}{\textsc{Locate}}
27 \newcommand{\MATCH}{\textsc{Match}}
28 \newcommand{\MATITA}{Matita}
29 \newcommand{\METAHEADING}{Symbol & Position \\ \hline\hline}
30 \newcommand{\MOWGLI}{MoWGLI}
31 \newcommand{\NAT}{\ensuremath{\mathit{nat}}}
32 \newcommand{\NATIND}{\mathit{nat\_ind}}
33 \newcommand{\NUPRL}{NuPRL}
34 \newcommand{\OCAML}{OCaml}
35 \newcommand{\PROP}{\mathit{Prop}}
36 \newcommand{\REF}[3]{\ensuremath{\mathit{Ref}_{#1}(#2,#3)}}
37 \newcommand{\TEXMACRO}[1]{\texttt{\char92 #1}}
38 \newcommand{\UWOBO}{UWOBO}
39 \newcommand{\WHELP}{Whelp}
40 \newcommand{\DOT}{\ensuremath{\mbox{\textbf{.}}}}
41 \newcommand{\SEMICOLON}{\ensuremath{\mbox{\textbf{;}}}}
42 \newcommand{\BRANCH}{\ensuremath{\mbox{\textbf{[}}}}
43 \newcommand{\SHIFT}{\ensuremath{\mbox{\textbf{\textbar}}}}
44 \newcommand{\POS}[1]{\ensuremath{#1\mbox{\textbf{:}}}}
45 \newcommand{\MERGE}{\ensuremath{\mbox{\textbf{]}}}}
46 \newcommand{\FOCUS}[1]{\ensuremath{\mathtt{focus}~#1}}
47 \newcommand{\UNFOCUS}{\ensuremath{\mathtt{unfocus}}}
48 \newcommand{\SKIP}{\MATHTT{skip}}
49 \newcommand{\TACTIC}[1]{\ensuremath{\mathtt{tactic}~#1}}
50
51 \definecolor{gray}{gray}{0.85} % 1 -> white; 0 -> black
52 \newcommand{\NT}[1]{\langle\mathit{#1}\rangle}
53 \newcommand{\URI}[1]{\texttt{#1}}
54
55 %{\end{SaveVerbatim}\setlength{\fboxrule}{.5mm}\setlength{\fboxsep}{2mm}%
56 \newenvironment{grafite}{\VerbatimEnvironment
57  \begin{SaveVerbatim}{boxtmp}}%
58  {\end{SaveVerbatim}\setlength{\fboxsep}{3mm}%
59   \begin{center}
60    \fcolorbox{black}{gray}{\BUseVerbatim[boxwidth=0.9\linewidth]{boxtmp}}
61   \end{center}}
62
63 \newcounter{example}
64 \newenvironment{example}{\stepcounter{example}\vspace{0.5em}\noindent\emph{Example} \arabic{example}.}
65  {}
66 \newcommand{\ASSIGNEDTO}[1]{\textbf{Assigned to:} #1}
67 \newcommand{\FILE}[1]{\texttt{#1}}
68 % \newcommand{\NOTE}[1]{\ifodd \arabic{page} \else \hspace{-2cm}\fi\ednote{#1}}
69 \newcommand{\NOTE}[1]{\ednote{#1}{foo}}
70 \newcommand{\TODO}[1]{\textbf{TODO: #1}}
71
72 \newsavebox{\tmpxyz}
73 \newcommand{\sequent}[2]{
74   \savebox{\tmpxyz}[0.9\linewidth]{
75     \begin{minipage}{0.9\linewidth}
76       \ensuremath{#1} \\
77       \rule{3cm}{0.03cm}\\
78       \ensuremath{#2}
79     \end{minipage}}\setlength{\fboxsep}{3mm}%
80   \begin{center}
81    \fcolorbox{black}{gray}{\usebox{\tmpxyz}}
82   \end{center}}
83
84 \bibliographystyle{plain}
85
86 \begin{document}
87
88 \begin{opening}
89
90  \title{The \MATITA{} Proof Assistant}
91
92 \author{Andrea \surname{Asperti} \email{asperti@cs.unibo.it}}
93 \author{Claudio \surname{Sacerdoti Coen} \email{sacerdot@cs.unibo.it}}
94 \author{Enrico \surname{Tassi} \email{tassi@cs.unibo.it}}
95 \author{Stefano \surname{Zacchiroli} \email{zacchiro@cs.unibo.it}}
96 \institute{Department of Computer Science, University of Bologna\\
97  Mura Anteo Zamboni, 7 --- 40127 Bologna, ITALY}
98
99 \runningtitle{The Matita proof assistant}
100 \runningauthor{Asperti, Sacerdoti Coen, Tassi, Zacchiroli}
101
102 % \date{data}
103
104 \begin{motto}
105 ``We are nearly bug-free'' -- \emph{CSC, Oct 2005}
106 \end{motto}
107
108 \begin{abstract}
109  abstract qui
110 \end{abstract}
111
112 \keywords{Proof Assistant, Mathematical Knowledge Management, XML, Authoring,
113 Digital Libraries}
114
115 \end{opening}
116
117 \section{Introduction}
118 \label{sec:intro}
119 {\em Matita} is the proof assistant under development by the \HELM{} team
120 \cite{mkm-helm} at the University of Bologna, under the direction of 
121 Prof.~Asperti. 
122 The origin of the system goes back to 1999. At the time we were mostly 
123 interested to develop tools and techniques to enhance the accessibility
124 via web of formal libraries of mathematics. Due to its dimension, the
125 library of the \COQ{} proof assistant (of the order of 35'000 theorems) 
126 was choosed as a privileged test bench for our work, although experiments
127 have been also conducted with other systems, and notably with \NUPRL{}.
128 The work, mostly performed in the framework of the recently concluded 
129 European project IST-33562 \MOWGLI{}~\cite{pechino}, mainly consisted in the 
130 following teps:
131 \begin{itemize}
132 \item exporting the information from the internal representation of
133  \COQ{} to a system and platform independent format. Since XML was at the 
134 time an emerging standard, we naturally adopted this technology, fostering
135 a content-based architecture for future system, where the documents
136 of the library were the the main components around which everything else 
137 has to be build;
138 \item developing indexing and searching techniques supporting semantic
139  queries to the library; these efforts gave birth to our \WHELP{}
140 search engine, described in~\cite{whelp};
141 \item developing languages and tools for a high-quality notational 
142 rendering of mathematical information; in particular, we have been 
143 active in the MathML Working group since 1999, and developed inside
144 \HELM{} a MathML-compliant widget for the GTK graphical environment
145 which can be integrated in any application.
146 \end{itemize}
147 The exportation issue, extensively discussed in \cite{exportation-module},
148 has several major implications worth to be discussed. 
149
150 The first
151 point concerns the kind of content information to be exported. In a
152 proof assistant like \COQ{}, proofs are represented in at least three clearly
153 distinguishable formats: \emph{scripts} (i.e. sequences of commands issued by the
154 user to the system during an interactive session of proof), \emph{proof objects}
155 (which is the low-level representation of proofs in the form of
156 lambda-terms readable to and checked by kernel) and \emph{proof-trees} (which
157 is a kind of intermediate representation, vaguely inspired by a sequent
158 like notation, that inherits most of the defects but essentially
159 none of the advantages of the previous representations). 
160 Partially related to this problem, there is the
161 issue of the {\em granularity} of the library: scripts usually comprise
162 small developments with many definitions and theorems, while 
163 proof objects correspond to individual mathematical items. 
164
165 In our case, the choice of the content encoding was eventually dictated
166 by the methodological assumption of offering the information in a
167 stable and system-independent format. The language of scripts is too
168 oriented to \COQ, and it changes too rapidly to be of any interest
169 to third parties. On the other side, the language of proof objects 
170 merely depend on
171 the logical framework (the Calculus of Inductive Constructions, in
172 the case of \COQ), is grammatically simple, semantically clear and, 
173 especially, is very stable (as kernels of proof assistants 
174 often are). 
175 So the granularity of the library is at the level of individual 
176 objects, that also justifies from another point of view the need
177 for efficient searching techniques for retrieving individual 
178 logical items from the repository. 
179
180 The main (possibly only) problem with proof objects is that they are
181 difficult to read and do not directly correspond to what the user typed
182 in. An analogy frequently made in the proof assistant community is that of
183 comparing the vernacular language of scripts to a high level source language
184 and lambda terms to the assembly language they are compiled in. We do not
185 share this view and prefer to look at scripts as an imperative language, 
186 and to lambda terms as their denotational semantics; still, however,
187 denotational semantics is possibly more formal but surely not more readable 
188 than the imperative source.
189
190 For all the previous reasons, a huge amount of work inside \MOWGLI{} has
191 been devoted to automatic reconstruction of proofs in natural language
192 from lambda terms. Since lambda terms are in close connection 
193 with natural deduction 
194 (that is still the most natural logical language discovered so far)
195 the work is not hopeless as it may seem, especially if rendering
196 is combined, as in our case, with dynamic features supporting 
197 in-line expansions or contractions of subproofs. The final 
198 rendering is probably not entirely satisfactory (see \cite{ida} for a
199 discussion), but surely
200 readable (the actual quality largely depends by the way the lambda 
201 term is written). 
202
203 Summing up, we already disposed of the following tools/techniques:
204 \begin{itemize}
205 \item XML specifications for the Calculus of Inductive Constructions,
206 with tools for parsing and saving mathematical objects in such a format;
207 \item metadata specifications and tools for indexing and querying the
208 XML knowledge base;
209 \item a proof checker (i.e. the {\em kernel} of a proof assistant), 
210  implemented to check that we exported form the \COQ{} library all the 
211 logically relevant content;
212 \item a sophisticated parser (used by the search engine), able to deal 
213 with potentially ambiguous and incomplete information, typical of the 
214 mathematical notation \cite{};
215 \item a {\em refiner}, i.e. a type inference system, based on complex 
216 existential variables, used by the disambiguating parser;
217 \item complex transformation algorithms for proof rendering in natural
218 language;
219 \item an innovative rendering widget, supporting high-quality bidimensional
220 rendering, and semantic selection, i.e. the possibility to select semantically
221 meaningful rendering expressions, and to past the respective content into
222 a different text area.
223 \NOTE{il widget non ha sel semantica}
224 \end{itemize}
225 Starting from all this, the further step of developing our own 
226 proof assistant was too
227 small and too tempting to be neglected. Essentially, we ``just'' had to
228 add an authoring interface, and a set of functionalities for the
229 overall management of the library, integrating everything into a
230 single system. \MATITA{} is the result of this effort. 
231
232 At first sight, \MATITA{} looks as (and partly is) a \COQ{} clone. This is
233 more the effect of the circumstances of its creation described 
234 above than the result of a deliberate design. In particular, we
235 (essentially) share the same foundational dialect of \COQ{} (the
236 Calculus of Inductive Constructions), the same implementative
237 language (\OCAML{}), and the same (script based) authoring philosophy.
238 However, as we shall see, the analogy essentially stops here. 
239
240 In a sense; we like to think of \MATITA{} as the way \COQ{} would 
241 look like if entirely rewritten from scratch: just to give an
242 idea, although \MATITA{} currently supports almost all functionalities of
243 \COQ{}, it links 60'000 lins of \OCAML{} code, against ... of \COQ{} (and
244 we are convinced that, starting from scratch again, we could furtherly
245 reduce our code in sensible way).\NOTE{righe \COQ{}}
246
247 \begin{itemize}
248  \item scelta del sistema fondazionale
249  \item sistema indipendente (da Coq)
250   \begin{itemize}
251    \item possibilit\`a di sperimentare (soluzioni architetturali, logiche,
252     implementative, \dots)
253    \item compatibilit\`a con sistemi legacy
254   \end{itemize}
255 \end{itemize}
256
257 \section{\HELM{} library(??)}
258
259 \subsection{libreria tutta visibile}
260 \ASSIGNEDTO{csc}
261 \NOTE{assumo che si sia gia' parlato di approccio content-centrico}
262 Our commitment to the content-centric view of the architecture of the system
263 has important consequences on the user's experience and on the functionalities
264 of several components of \MATITA. In the content-centric view the library
265 of mathematical knowledge is an already existent and completely autonomous
266 entity that we are allowed to exploit and augment using \MATITA. Thus, in
267 principle, when the user starts to prove a new theorem she has complete
268 visibility of the library and she can refer to every definition and lemma,
269 also using the mathematical notation already developed. In a similar way,
270 every form of automation of the system must be able to analyze and possibly
271 exploit every notion in the library.
272
273 The benefits of this approach highly justify the non neglectable price to pay
274 in the development of several components. We analyse now a few of the causes
275 of this additional complexity.
276
277 \subsubsection{Ambiguity}
278 A rich mathematical library includes equivalent definitions and representations
279 of the same notion. Moreover, mathematical notation inside a rich library is
280 surely highly overloaded. As a consequence every mathematical expression the
281 user provides is highly ambiguous since all the definitions,
282 representations and special notations are available at once to the user.
283
284 The usual solution to the problem, as adopted for instance in Coq, is to
285 restrict the user's scope to just one interpretation for each definition,
286 representation or notation. In this way much of the ambiguity is removed,
287 burdening the user that must someway declare what is in scope and that must
288 use special syntax when she needs to refer to something not in scope.
289
290 Even with this approach ambiguity cannot be completely removed since implicit
291 coercions can be arbitrarily inserted by the system to ``change the type''
292 of subterms that do not have the expected type. Usually implicit coercions
293 are used to overcome the absence of subtyping that should mimic the subset
294 relation found in set theory. For instance, the expression
295 $\forall n \in nat. 2 * n * \pi \equiv_\pi 0$ is correct in set theory since
296 the set of natural numbers is a subset of that of real numbers; the
297 corresponding expression $\forall n:nat. 2*n*\pi \equiv_\pi 0$ is not well typed
298 and requires the automatic insertion of the coercion $real_of_nat: nat \to R$
299 either around both 2 and $n$ (to make both products be on real numbers) or
300 around the product $2*n$. The usual approach consists in either rejecting the
301 ambiguous term or arbitrarily choosing one of the interpretations. For instance,
302 Coq rejects the declaration of coercions that have alternatives
303 (i.e. already declared coercions with the same domain and codomain)
304 or that are obtained composing other coercions in order to
305 avoid making several terms highly ambiguous by choosing to insert any one of the
306 alternative coercions. Coq also arbitrarily chooses how to insert coercions in
307 terms to make them well typed when there is more than one possibility (as in
308 the previous example).
309
310 The approach we are following is radically different. It consists in dealing
311 with ambiguous expressions instead of avoiding them. As a last resource,
312 when the system is unable to disambiguate the input, the user is interactively
313 required to provide more information that is recorded to avoid asking the
314 same question again in subsequent processing of the same input.
315 More details on our approach can be found in \ref{sec:disambiguation}.
316
317 \subsubsection{Consistency}
318 A large mathematical library is likely to be logically inconsistent.
319 It may contain incompatible axioms or alternative conjectures and it may
320 even use definitions in incompatible ways. To clarify this last point,
321 consider two identical definitions of a set of elements of a given type
322 (or of a category of objects of a given type). Let us call the two definitions
323 $A-Set$ and $B-Set$ (or $A-Category$ and $B-Category$).
324 It is perfectly legitimate to either form the $A-Set$ of every $B-Set$
325 or the $B-Set$ of every $A-Set$ (the same for categories). This just corresponds
326 to assuming that a $B-Set$ (respectively an $A-Set$) is a small set, whereas
327 an $A-Set$ (respectively a $B-Set$) is a big set (possibly of small sets).
328 However, if one part of the library assumes $A-Set$s to be the small ones
329 and another part of the library assumes $B-Set$s to be the small ones, the
330 library as a whole will be logically inconsistent.
331
332 Logical inconsistency has never been a problem in the daily work of a
333 mathematician. The mathematician simply imposes himself a discipline to
334 restrict himself to consistent subsets of the mathematical knowledge.
335 However, in doing so he does not choose the subset in advance by forgetting
336 the rest of his knowledge. On the contrary he may proceed with a sort of
337 top-down strategy: he may always inspect or use part of his knowledge, but
338 when he actually does so he should check recursively that inconsistencies are
339 not exploited.
340
341 Contrarily to the mathematical practice, the usual tendency in the world of
342 assisted automation is that of building a logical environment (a consistent
343 subset of the library) in a bottom up way, checking the consistency of a
344 new axiom or theorem as soon as it is added to the environment. No lemma
345 or definition outside the environment can be used until it is added to the
346 library after every notion it depends on. Moreover, very often the logical
347 environment is the only part of the library that can be inspected,
348 that we can search lemmas in and that can be exploited by automatic tactics.
349
350 Moving one by one notions from the library to the environment is a costly
351 operation since it involves re-checking the correctness of the notion.
352 As a consequence mathematical notions are packages into theories that must
353 be added to the environment as a whole. However, the consistency problem is
354 only raised at the level of theories: theories must be imported in a bottom
355 up way and the system must check that no inconsistency arises.
356
357 The practice of limiting the scope on the library to the logical environment
358 is contrary to our commitment of being able to fully exploit as much as possible
359 of the library at any given time. To reconcile the two worlds, we have
360 designed \MATITA \ldots \NOTE{Da completare se lo riteniamo un punto interessante.}
361
362 \subsubsection{Accessibility}
363 A large library that is completely in scope needs effective indexing and
364 searching methods to make the user productive. Libraries of formal results
365 are particularly critical since they hold a large percentage of technical
366 lemmas that do not have a significative name and that must be retrieved
367 using advanced methods based on matching, unification, generalization and
368 instantiation.
369
370 The efficiency of searching inside the library becomes a critical operation
371 when automatic tactics exploit the library during the proof search. In this
372 scenario the tactics must retrieve a set of candidates for backward or
373 forward reasoning in a few milliseconds.
374
375 In Sect.~\ref{sec:metadata} we describe the technique adopted in \MATITA.
376
377 \subsubsection{Library management}
378
379
380 \subsection{ricerca e indicizzazione}
381 \label{sec:metadata}
382 \ASSIGNEDTO{andrea}
383
384 \subsection{auto}
385 \ASSIGNEDTO{andrea}
386
387 \subsection{sostituzioni esplicite vs moduli}
388 \ASSIGNEDTO{csc}
389
390 \subsection{xml / gestione della libreria}
391 \ASSIGNEDTO{gares}
392
393
394 \section{User Interface (da cambiare)}
395
396 \subsection{assenza di proof tree / resa in linguaggio naturale}
397 \ASSIGNEDTO{andrea}
398
399 \subsection{Disambiguation}
400 \label{sec:disambiguation}
401 \ASSIGNEDTO{zack}
402
403  \begin{table}
404   \caption{\label{tab:termsyn} Concrete syntax of CIC terms: built-in
405   notation\strut}
406  \hrule
407  \[
408  \begin{array}{@{}rcll@{}}
409    \NT{term} & ::= & & \mbox{\bf terms} \\
410      &     & x & \mbox{(identifier)} \\
411      &  |  & n & \mbox{(number)} \\
412      &  |  & s & \mbox{(symbol)} \\
413      &  |  & \mathrm{URI} & \mbox{(URI)} \\
414      &  |  & \verb+_+ & \mbox{(implicit)}\TODO{sync} \\
415      &  |  & \verb+?+n~[\verb+[+~\{\NT{subst}\}~\verb+]+] & \mbox{(meta)} \\
416      &  |  & \verb+let+~\NT{ptname}~\verb+\def+~\NT{term}~\verb+in+~\NT{term} \\
417      &  |  & \verb+let+~\NT{kind}~\NT{defs}~\verb+in+~\NT{term} \\
418      &  |  & \NT{binder}~\{\NT{ptnames}\}^{+}~\verb+.+~\NT{term} \\
419      &  |  & \NT{term}~\NT{term} & \mbox{(application)} \\
420      &  |  & \verb+Prop+ \mid \verb+Set+ \mid \verb+Type+ \mid \verb+CProp+ & \mbox{(sort)} \\
421      &  |  & \verb+match+~\NT{term}~ & \mbox{(pattern matching)} \\
422      &     & ~ ~ [\verb+[+~\verb+in+~x~\verb+]+]
423               ~ [\verb+[+~\verb+return+~\NT{term}~\verb+]+] \\
424      &     & ~ ~ \verb+with [+~[\NT{rule}~\{\verb+|+~\NT{rule}\}]~\verb+]+ & \\
425      &  |  & \verb+(+~\NT{term}~\verb+:+~\NT{term}~\verb+)+ & \mbox{(cast)} \\
426      &  |  & \verb+(+~\NT{term}~\verb+)+ \\
427    \NT{defs}  & ::= & & \mbox{\bf mutual definitions} \\
428      &     & \NT{fun}~\{\verb+and+~\NT{fun}\} \\
429    \NT{fun} & ::= & & \mbox{\bf functions} \\
430      &     & \NT{arg}~\{\NT{ptnames}\}^{+}~[\verb+on+~x]~\verb+\def+~\NT{term} \\
431    \NT{binder} & ::= & & \mbox{\bf binders} \\
432      &     & \verb+\forall+ \mid \verb+\lambda+ \\
433    \NT{arg} & ::= & & \mbox{\bf single argument} \\
434      &     & \verb+_+ \mid x \\
435    \NT{ptname} & ::= & & \mbox{\bf possibly typed name} \\
436      &     & \NT{arg} \\
437      &  |  & \verb+(+~\NT{arg}~\verb+:+~\NT{term}~\verb+)+ \\
438    \NT{ptnames} & ::= & & \mbox{\bf bound variables} \\
439      &     & \NT{arg} \\
440      &  |  & \verb+(+~\NT{arg}~\{\verb+,+~\NT{arg}\}~[\verb+:+~\NT{term}]~\verb+)+ \\
441    \NT{kind} & ::= & & \mbox{\bf induction kind} \\
442      &     & \verb+rec+ \mid \verb+corec+ \\
443    \NT{rule} & ::= & & \mbox{\bf rules} \\
444      &     & x~\{\NT{ptname}\}~\verb+\Rightarrow+~\NT{term}
445  \end{array}
446  \]
447  \hrule
448  \end{table}
449  
450
451 \subsubsection{Term input}
452
453 The primary form of user interaction employed by \MATITA{} is textual script
454 editing: the user modifies it and evaluate step by step its composing
455 \emph{statements}. Examples of statements are inductive type definitions,
456 theorem declarations, LCF-style tacticals, and macros (e.g. \texttt{Check} can
457 be used to ask the system to refine a given term and pretty print the result).
458 Since many statements refer to terms of the underlying calculus, \MATITA{} needs
459 a concrete syntax able to encode terms of the Calculus of Inductive
460 Constructions.
461
462 Two of the requirements in the design of such a syntax are apparently in
463 contrast:
464 \begin{enumerate}
465  \item the syntax should be as close as possible to common mathematical practice
466   and implement widespread mathematical notations;
467  \item each term described by the syntax should be non-ambiguous meaning that it
468   should exists a function which associates to it a CIC term.
469 \end{enumerate}
470
471 These two requirements are addressed in \MATITA{} by the mean of two mechanisms
472 which work together: \emph{term disambiguation} and \emph{extensible notation}.
473 Their interaction is visible in the architecture of the \MATITA{} input phase,
474 depicted in Fig.~\ref{fig:inputphase}. The architecture is articulated as a
475 pipline of three levels: the concrete syntax level (level 0) is the one the user
476 has to deal with when inserting CIC terms; the abstract syntax level (level 2)
477 is an internal representation which intuitively encodes mathematical formulae at
478 the content level~\cite{adams}\cite{mkm-structure}; the last level is that of
479 CIC terms.
480
481 \begin{figure}[ht]
482  \begin{center}
483   \includegraphics[width=0.9\textwidth]{input_phase}
484   \caption{\MATITA{} input phase}
485  \end{center}
486  \label{fig:inputphase}
487 \end{figure}
488
489 Requirement (1) is addressed by a built-in concrete syntax for terms, described
490 in Tab.~\ref{tab:termsyn}, and the extensible notation mechanisms which offers a
491 way for extending available mathematical notations. Extensible notation, which
492 is also in charge of providing a parsing function mapping concrete syntax terms
493 to content level terms, is described in Sect.~\ref{sec:notation}.  Requirement
494 (2) is addressed by the conjunct action of that parsing function and
495 disambiguation which provides a function from content level terms to CIC terms.
496
497 \subsubsection{Sources of ambiguity}
498
499 The translation from content level terms to CIC terms is not straightforward
500 because some nodes of the content encoding admit more that one CIC encoding,
501 invalidating requirement (2).
502
503 \begin{example}
504  \label{ex:disambiguation}
505
506  Consider the term at the concrete syntax level \texttt{\TEXMACRO{forall} x. x +
507  ln 1 = x} of Fig.~\ref{fig:inputphase}(a), it can be the type of a lemma the
508  user may want to prove. Assuming that both \texttt{+} and \texttt{=} are parsed
509  as infix operators, all the following questions are legitimate and must be
510  answered before obtaining a CIC term from its content level encoding
511  (Fig.~\ref{fig:inputphase}(b)):
512
513  \begin{enumerate}
514
515   \item Since \texttt{ln} is an unbound identifier, which CIC constants does it
516    represent? Many different theorems in the library may share its (rather
517    short) name \dots
518
519   \item Which kind of number (\IN, \IR, \dots) the \texttt{1} literal stand for?
520    Which encoding is used in CIC to represent it? E.g., assuming $1\in\IN$, is
521    it an unary or a binary encoding?
522
523   \item Which kind of equality the ``='' node represents? Is it Leibniz's
524    polymorhpic equality? Is it a decidable equality over \IN, \IR, \dots?
525
526  \end{enumerate}
527
528 \end{example}
529
530 In \MATITA, three \emph{sources of ambiguity} are admitted for content level
531 terms: unbound identifiers, literal numbers, and operators. Each instance of
532 ambiguity sources (ambiguous entity) occuring in a content level term is
533 associated to a \emph{disambiguation domain}. Intuitively a disambiguation
534 domain is a set of CIC terms which may be replaced for an ambiguous entity
535 during disambiguation. Each item of the domain is said to be an
536 \emph{interpretation} for the ambiguous entity.
537
538 \emph{Unbound identifiers} (question 1) are ambiguous entities since the
539 namespace of CIC objects is not flat and the same identifier may denote many
540 ofthem. For example the short name \texttt{plus\_assoc} in the \HELM{} library
541 is shared by three different theorems stating the associative property of
542 different additions.  This kind of ambiguity is avoidable if the user is willing
543 to use long names (in form of URIs in the \texttt{cic://} scheme) in the
544 concrete syntax, with the obvious drawbacks of obtaining long and unreadable
545 terms.
546
547 Given an unbound identifier, the corresponding disambiguation domain is computed
548 querying the library for all constants, inductive types, and inductive type
549 constructors having it as their short name (see the \LOCATE{} query in
550 Sect.~\ref{sec:metadata}).
551
552 \emph{Literal numbers} (question 2) are ambiguous entities as well since
553 different kinds of numbers can be encoded in CIC (\IN, \IR, \IZ, \dots) using
554 different encodings. Considering the restricted example of natural numbers we
555 can for instance encode them in CIC using inductive datatypes with a number of
556 constructor equal to the encoding base plus 1, obtaining one encoding for each
557 base.
558
559 For each possible way of mapping a literal number to a CIC term, \MATITA{} is
560 aware of a \emph{number intepretation function} which, when applied to the
561 natural number denoted by the literal\footnote{at the moment only literal
562 natural number are supported in the concrete syntax} returns a corresponding CIC
563 term. The disambiguation domain for a given literal number is built applying to
564 the literal all available number interpretation functions in turn.
565
566 Number interpretation functions can be defined in OCaml or directly using
567 \TODO{notazione per i numeri}.
568
569 \emph{Operators} (question 3) are intuitively head of applications, as such they
570 are always applied to a (possiblt empty) sequence of arguments. Their ambiguity
571 is a need since it is often the case that some notation is used in an overloaded
572 fashion to hide the use of different CIC constants which encodes similar
573 concepts. For example, in the standard library of \MATITA{} the infix \texttt{+}
574 notation is available building a binary \texttt{Op(+)} node, whose
575 disambiguation domain may refer to different constants like the addition over
576 natural numbers \URI{cic:/matita/nat/plus/plus.con} or that over real numbers of
577 the \COQ{} standard library \URI{cic:/Coq/Reals/Rdefinitions/Rplus.con}.
578
579 For each possible way of mapping an operator application to a CIC term,
580 \MATITA{} knows an \emph{operator interpretation function} which, when applied
581 to an operator and its arguments, returns a CIC term. The disambiguation domain
582 for a given operator is built applying to the operator and its arguments all
583 available operator interpretation functions in turn.
584
585 Operator interpretation functions could be added using the
586 \texttt{interpretation} statement. For example, among the first line of the
587 script \FILE{matita/library/logic/equality.ma} from the \MATITA{} standard
588 library we read:
589
590 \begin{grafite}
591 interpretation "leibnitz's equality"
592  'eq x y =
593    (cic:/matita/logic/equality/eq.ind#xpointer(1/1) _ x y).
594 \end{grafite}
595
596 Evaluating it in \MATITA{} will add an operator interpretation function for the
597 binary operator \texttt{eq} which expands to the CIC term on the right hand side
598 of the statement. That CIC term can be written using only built-in concrete
599 syntax, can contain no ambiguity source; still, it can refer to operator
600 arguments bound on the left hand side and can contain implicit terms (denoted
601 with \texttt{\_}) which will be expanded to fresh metavariables. The latter
602 feature is used in the example above for the first argument of Leibniz's
603 polymorhpic equality.
604
605 \subsubsection{Disambiguation algorithm}
606
607 A \emph{disambiguation algorithm} takes as input a content level term and return
608 a fully determined CIC term. The key observation on which a disambiguation
609 algorithm is based is that given a content level term with more than one sources
610 of ambiguity, not all possible combination of interpretation lead to a typable
611 CIC term. In the term of Ex.~\ref{ex:disambiguation} for instance the
612 interpretation of \texttt{ln} as a function from \IR to \IR and the
613 interpretation of \texttt{1} as the Peano number $1$ can't coexists. The notion
614 of ``can't coexists'' in the disambiguation of \MATITA{} is defined on top of
615 the \emph{refiner} for CIC terms described in~\cite{csc-phd}.
616
617 Briefly, a refiner is a function whose input is an \emph{incomplete CIC term}
618 $t_1$ --- i.e. a term where metavariables occur (Sect.~\ref{sec:metavariables}
619 --- and whose output is either:\NOTE{descrizione sommaria del refiner, pu\'o
620 essere spostata altrove}
621
622 \begin{enumerate}
623  
624  \item an incomplete CIC term $t_2$ where $t_2$ is a well-typed term obtained
625   assigning a type to each metavariable in $t_1$ (in case of dependent types,
626   instantiation of some of the metavariable occurring in $t_1$ may occur as
627   well);
628
629  \item $\epsilon$, meaning that no well-typed term could be obtained via
630   assignment of type to metavariable in $t_1$ and their instantiation;
631
632  \item $\bot$, meaning that the refiner is unable to decide whether of the two
633   cases above apply (refinement is semi-decidable).
634
635 \end{enumerate}
636
637 On top of a CIC refiner \MATITA{} implement an efficient disambiguation
638 algorithm, which is outlined below. It takes as input a content level term $c$
639 and proceeds as follows:
640
641 \begin{enumerate}
642
643  \item Create disambiguation domains $\{D_i | i\in\mathit{Dom}(c)\}$, where
644   $\mathit{Dom}(c)$ is the set of ambiguity sources of $c$. Each $D_i$ is a set
645   of CIC terms and can be built as described above.
646
647  \item An \emph{interpretation} $\Phi$ for $c$ is a map associating an
648   incomplete CIC term to each ambiguity source of $c$. Given $c$ and one of its
649   interpretations an incomplete CIC term is fully determined replacing each
650   ambiguity source of $c$ with its mapping in the interpretation and injecting
651   the remaining structure of the content level in the CIC level (e.g. replacing
652   the application of the content level with the application of the CIC level).
653   This operation is informally called ``interpreting $c$ with $\Phi$''.
654   
655   Create an initial interpretation $\Phi_0 = \{\phi_i | \phi_i = \_,
656   i\in\mathit{Dom}(c)\}$, which associates a fresh metavariable to each source
657   of ambiguity of $c$. During this step, implicit terms are expanded to fresh
658   metavariables as well.
659
660  \item Refine the current incomplete CIC term (i.e.  the term obtained
661   interpreting $t$ with $\Phi_i$).
662
663   If the refinement succeeds or is undetermined the next interpretation
664   $\Phi_{i+1}$ will be created \emph{making a choice}, that is replacing in the
665   current interpretation one of the metavariable appearing in $\Phi_i$ with one
666   of the possible choice from the corresponding disambiguation domain. The
667   metavariable to be replaced is chosen following a preorder visit of the
668   ambiguous term. Then, step 3 is attempted again with the new interpretation.
669     
670   If the refinement fails the current set of choices cannot lead to a well-typed
671   term and backtracking of the current interpretation is attempted.
672     
673  \item Once an unambiguous correct interpretation is found (i.e. $\Phi_i$ does
674   no longer contain any placeholder), backtracking is attempted anyway to find
675   the other correct interpretations.
676
677  \item Let $n$ be the number of interpretations who survived step 4. If $n=0$
678   signal a type error. If $n=1$ we have found exactly one (incomplete) CIC term
679   corresponding to the content level term $c$, returns it as output of the
680   disambiguation phase. If $n>1$ we have found many different (incomplete) CIC
681   terms which can correspond to the content level term, let the user choose one
682   of the $n$ interpretations and returns the corresponding term.
683
684 \end{enumerate}
685
686 The efficiency of this algorithm resides in the fact that as soon as an
687 incomplete CIC term is not typable, no further instantiation of the
688 metavariables of the corresponding interpretation is attemped.
689 % For example, during the disambiguation of the user input
690 % \texttt{\TEXMACRO{forall} x. x*0 = 0}, an interpretation $\Phi_i$ is
691 % encountered which associates $?$ to the instance of \texttt{0} on the right,
692 % the real number $0$ to the instance of \texttt{0} on the left, and the
693 % multiplication over natural numbers (\texttt{mult} for short) to \texttt{*}.
694 % The refiner will fail, since \texttt{mult} require a natural argument, and no
695 % further instantiation of the placeholder will be tried.
696
697 Details of the disambiguation algorithm along with an analysis of its complexity
698 can be found in~\cite{disambiguation}, where a formulation without backtracking
699 (corresponding to the actual \MATITA{} implementation) is also presented.
700
701 \subsubsection{Disambiguation stages}
702
703 \subsection{notazione}
704 \label{sec:notation}
705 \ASSIGNEDTO{zack}
706
707 \subsection{mathml}
708 \ASSIGNEDTO{zack}
709
710 \subsection{selezione semantica, cut paste, hyperlink}
711 \ASSIGNEDTO{zack}
712
713 \subsection{pattern}
714 \ASSIGNEDTO{gares}\\
715 Patterns are the textual counterpart of the MathML widget graphical
716 selection.
717
718 Matita benefits of a graphical interface and a powerful MathML rendering
719 widget that allows the user to select pieces of the sequent he is working
720 on. While this is an extremely intuitive way for the user to
721 restrict the application of tactics, for example, to some subterms of the
722 conclusion or some hypothesis, the way this action is recorded to the text
723 script is not obvious.\\
724 In \MATITA{} this issue is addressed by patterns.
725
726 \subsubsection{Pattern syntax}
727 A pattern is composed of two terms: a $\NT{sequent\_path}$ and a
728 $\NT{wanted}$.
729 The former mocks-up a sequent, discharging unwanted subterms with $?$ and
730 selecting the interesting parts with the placeholder $\%$. 
731 The latter is a term that lives in the context of the placeholders.
732
733 The concrete syntax is reported in table \ref{tab:pathsyn}
734 \NOTE{uso nomi diversi dalla grammatica ma che hanno + senso}
735 \begin{table}
736  \caption{\label{tab:pathsyn} Concrete syntax of \MATITA{} patterns.\strut}
737 \hrule
738 \[
739 \begin{array}{@{}rcll@{}}
740   \NT{pattern} & 
741     ::= & [~\verb+in match+~\NT{wanted}~]~[~\verb+in+~\NT{sequent\_path}~] & \\
742   \NT{sequent\_path} & 
743     ::= & \{~\NT{ident}~[~\verb+:+~\NT{multipath}~]~\}~
744       [~\verb+\vdash+~\NT{multipath}~] & \\
745   \NT{wanted} & ::= & \NT{term} & \\
746   \NT{multipath} & ::= & \NT{term\_with\_placeholders} & \\
747 \end{array}
748 \]
749 \hrule
750 \end{table}
751
752 \subsubsection{How patterns work}
753 Patterns mimic the user's selection in two steps. The first one
754 selects roots (subterms) of the sequent, using the
755 $\NT{sequent\_path}$,  while the second 
756 one searches the $\NT{wanted}$ term starting from these roots. Both are
757 optional steps, and by convention the empty pattern selects the whole
758 conclusion.
759
760 \begin{description}
761 \item[Phase 1]
762   concerns only the $[~\verb+in+~\NT{sequent\_path}~]$
763   part of the syntax. $\NT{ident}$ is an hypothesis name and
764   selects the assumption where the following optional $\NT{multipath}$
765   will operate. \verb+\vdash+ can be considered the name for the goal.
766   If the whole pattern is omitted, the whole goal will be selected.
767   If one or more hypotheses names are given the selection is restricted to 
768   these assumptions. If a $\NT{multipath}$ is omitted the whole
769   assumption is selected. Remember that the user can be mostly
770   unaware of this syntax, since the system is able to write down a 
771   $\NT{sequent\_path}$ starting from a visual selection.
772   \NOTE{Questo ancora non va in matita}
773
774   A $\NT{multipath}$ is a CiC term in which a special constant $\%$
775   is allowed.
776   The roots of discharged subterms are marked with $?$, while $\%$
777   is used to select roots. The default $\NT{multipath}$, the one that
778   selects the whole term, is simply $\%$.
779   Valid $\NT{multipath}$ are, for example, $(?~\%~?)$ or $\%~\verb+\to+~(\%~?)$
780   that respectively select the first argument of an application or
781   the source of an arrow and the head of the application that is
782   found in the arrow target.
783
784   The first phase selects not only terms (roots of subterms) but also 
785   their context that will be eventually used in the second phase.
786
787 \item[Phase 2] 
788   plays a role only if the $[~\verb+in match+~\NT{wanted}~]$
789   part is specified. From the first phase we have some terms, that we
790   will see as subterm roots, and their context. For each of these
791   contexts the $\NT{wanted}$ term is disambiguated in it and the
792   corresponding root is searched for a subterm $\alpha$-equivalent to
793   $\NT{wanted}$. The result of this search is the selection the
794   pattern represents.
795
796 \end{description}
797
798 \noindent
799 Since the first step is equipotent to the composition of the two
800 steps, the system uses it to represent each visual selection.
801 The second step is only meant for the
802 experienced user that writes patterns by hand, since it really
803 helps in writing concise patterns as we will see in the
804 following examples.
805
806 \subsubsection{Examples}
807 To explain how the first step works let's give an example. Consider
808 you want to prove the uniqueness of the identity element $0$ for natural
809 sum, and that you can relay on the previously demonstrated left
810 injectivity of the sum, that is $inj\_plus\_l:\forall x,y,z.x+y=z+y \to x =z$.
811 Typing
812 \begin{grafite}
813 theorem valid_name: \forall n,m. m + n = n \to m = O.
814   intros (n m H).
815 \end{grafite}
816 \noindent
817 leads you to the following sequent 
818 \sequent{
819 n:nat\\
820 m:nat\\
821 H: m + n = n}{
822 m=O
823 }
824 \noindent
825 where you want to change the right part of the equivalence of the $H$
826 hypothesis with $O + n$ and then use $inj\_plus\_l$ to prove $m=O$.
827 \begin{grafite}
828   change in H:(? ? ? %) with (O + n).
829 \end{grafite}
830 \noindent
831 This pattern, that is a simple instance of the $\NT{sequent\_path}$
832 grammar entry, acts on $H$ that has type (without notation) $(eq~nat~(m+n)~n)$
833 and discharges the head of the application and the first two arguments with a
834 $?$ and selects the last argument with $\%$. The syntax may seem uncomfortable,
835 but the user can simply select with the mouse the right part of the equivalence
836 and left to the system the burden of writing down in the script file the
837 corresponding pattern with $?$ and $\%$ in the right place (that is not
838 trivial, expecially where implicit arguments are hidden by the notation, like
839 the type $nat$ in this example).
840
841 Changing all the occurrences of $n$ in the hypothesis $H$ with $O+n$ 
842 works too and can be done, by the experienced user, writing directly
843 a simpler pattern that uses the second phase.
844 \begin{grafite}
845   change in match n in H with (O + n).
846 \end{grafite}
847 \noindent
848 In this case the $\NT{sequent\_path}$ selects the whole $H$, while
849 the second phase searches the wanted $n$ inside it by
850 $\alpha$-equivalence. The resulting
851 equivalence will be $m+(O+n)=O+n$ since the second phase found two
852 occurrences of $n$ in $H$ and the tactic changed both.
853
854 Just for completeness the second pattern is equivalent to the
855 following one, that is less readable but uses only the first phase.
856 \begin{grafite}
857   change in H:(? ? (? ? %) %) with (O + n).
858 \end{grafite}
859 \noindent
860
861 \subsubsection{Tactics supporting patterns}
862 In \MATITA{} all the tactics that can be restricted to subterm of the working
863 sequent accept the pattern syntax. In particular these tactics are: simplify,
864 change, fold, unfold, generalize, replace and rewrite.
865
866 \NOTE{attualmente rewrite e fold non supportano phase 2. per
867 supportarlo bisogna far loro trasformare il pattern phase1+phase2 
868 in un pattern phase1only come faccio nell'ultimo esempio. lo si fa
869 con una pattern\_of(select(pattern))}
870
871 \subsubsection{Comparison with Coq}
872 Coq has a two diffrent ways of restricting the application of tactis to
873 subterms of the sequent, both relaying on the same special syntax to identify
874 a term occurrence.
875
876 The first way is to use this special syntax to specify directly to the
877 tactic the occurrnces of a wanted term that should be affected, while
878 the second is to prepare the sequent with another tactic called
879 pattern and the apply the real tactic. Note that the choice is not
880 left to the user, since some tactics needs the sequent to be prepared
881 with pattern and do not accept directly this special syntax.
882
883 The base idea is that to identify a subterm of the sequent we can
884 write it and say that we want, for example, the third and the fifth
885 occurce of it (counting from left to right). In our previous example,
886 to change only the left part of the equivalence, the correct command
887 is
888 \begin{grafite}
889   change n at 2 in H with (O + n)
890 \end{grafite} 
891 \noindent
892 meaning that in the hypothesis $H$ the $n$ we want to change is the
893 second we encounter proceeding from left toright.
894
895 The tactic pattern computes a
896 $\beta$-expansion of a part of the sequent with respect to some
897 occurrences of the given term. In the previous example the following
898 command
899 \begin{grafite}
900   pattern n at 2 in H
901 \end{grafite}
902 \noindent
903 would have resulted in this sequent
904 \begin{grafite}
905   n : nat
906   m : nat
907   H : (fun n0 : nat => m + n = n0) n
908   ============================
909    m = 0
910 \end{grafite}
911 \noindent
912 where $H$ is $\beta$-expanded over the second $n$
913 occurrence. This is a trick to make the unification algorithm ignore
914 the head of the application (since the unification is essentially
915 first-order) but normally operate on the arguments. 
916 This works for some tactics, like rewrite and replace,
917 but for example not for change and other tactics that do not relay on
918 unification. 
919
920 The idea behind this way of identifying subterms in not really far
921 from the idea behind patterns, but really fails in extending to
922 complex notation, since it relays on a mono-dimensional sequent representation.
923 Real math notation places arguments upside-down (like in indexed sums or
924 integrations) or even puts them inside a bidimensional matrix.  
925 In these cases using the mouse to select the wanted term is probably the 
926 only way to tell the system exactly what you want to do. 
927
928 One of the goals of \MATITA{} is to use modern publishing techiques, and
929 adopting a method for restricting tactics application domain that discourages 
930 using heavy math notation, would definitively be a bad choice.
931
932 \subsection{Tacticals}
933 \ASSIGNEDTO{gares}\\
934 There are mainly two kinds of languages used by proof assistants to recorder
935 proofs: tactic based and declarative. We will not investigate the philosophy
936 aroud the choice that many proof assistant made, \MATITA{} included, and we will not compare the two diffrent approaches. We will describe the common issues of the first one and how \MATITA{} tries to solve them.
937
938 First we must highlight the fact that proof scripts made using tactis are
939 particularly unreadable. This is not a big deal for the user while he is
940 constructing the proof, but is considerably a problem when he tries to reread
941 what he did or when he shows his work to someone else.
942
943 Another common issue for tactic based proof scripts is their mantenibility.
944 Huge libraries have been developed, and backward compatibility is a really time
945 consuming task. This problem is usually ameliorated with tacticals, that
946 help in structuring proofs and consequently their maintenance, but have a bad
947 counterpart in script readability.  Since tacticals are executed atomically,
948 the common practice of executing again a script to review all the proof steps
949 doesn't work at all. This issue in addition to the really poor feeling that a
950 list of tactics gives about the proof makes script rereading particularly hard.
951
952 \MATITA{} uses a language of tactics and tacticals, but adopts a peculiar
953 strategy to make this technique more user friendly without loosing in
954 mantenibility or expressivity.
955
956 \subsubsection{Tacticals overview}
957 Before describing the peculiarities of \MATITA{} tacticals we briefly introduce what tacticals are and where they can be useful.
958
959 Tacticals first appered in LCF(cita qualcosa) and can be seen as programming
960 constructs, like looping, branching, error recovery or sequential composition.
961 For example $tac_1~.~tac_2$ executes the first tactic and applies the second
962 only to the first goal opened by $tac_1$. Baranching can be used to specify a
963 diffrent tactic to apply to each new goal opened by another tactic, for example
964 $tac_1\verb+;[+~tac_{1.1}~\verb+|+~tac_{1.2}~\verb+|+~\cdots~|~tac_{1.n}~\verb+]+$
965 applies respectively $tac_{1.i}$ to the $i$-th goal opened by $tac_1$. Looping
966 can be used to iterate a tactic until it works: $\verb+repeat+~tac$ applies
967 $tac$ to the current goal, and again $tac$ to the eventually resulting goals
968 until all goal are closed or the tactic fails.
969
970 \begin{table}
971  \caption{\label{tab:tacsyn} Concrete syntax of \MATITA{} tacticals.\strut}
972 \hrule
973 \[
974 \begin{array}{@{}rcll@{}}
975   \NT{punctuation} & 
976     ::= & \SEMICOLON \quad|\quad \DOT \quad|\quad \SHIFT \quad|\quad \BRANCH \quad|\quad \MERGE \quad|\quad \POS{\mathrm{NUMBER}~} & \\
977   \NT{block\_kind} & 
978     ::= & \verb+focus+ ~|~ \verb+try+ ~|~ \verb+solve+ ~|~ \verb+first+ ~|~ \verb+repeat+ ~|~ \verb+do+~\mathrm{NUMBER} & \\
979   \NT{block\_delimiter} & 
980     ::= & \verb+begin+ ~|~ \verb+end+ & \\
981   \NT{tactical} & 
982     ::= & \verb+skip+ ~|~ \NT{tactic} ~|~ \NT{block\_delimiter} ~|~ \NT{block\_kind} ~|~ \NT{punctuation} ~|~& \\
983 \end{array}
984 \]
985 \hrule
986 \end{table}
987
988 \MATITA{} tacticals syntax is reported in table \ref{tab:tacsyn}.
989 While one whould expect to find structured constructs like 
990 $\verb+do+~n~\NT{tactic}$ the syntax allows pieces of tacticals to be written.
991 This is essential for base idea behind matita tacticals: step-by-step execution.
992
993 \subsubsection{\MATITA{} Tinycals}
994 The low-level tacticals implementation of \MATITA{} allows a step-by-step execution of a tactical, that substantially means that a $\NT{block\_kind}$ is not executed as an atomic operation. This has two major benefits for the user, even being a so simple idea:
995 \begin{description}
996 \item[Proof structuring] 
997   is much easyer. Consider for example a proof by induction, and imagine you are using classical tacticals. After applying the
998   induction principle, with one step tacticals, you have to choose: structure
999   the proof or not. If you decide for the former you have to branch with
1000   \verb+[+ and write tactics for all the cases separated by \verb+|+ and the
1001   close the tactical with
1002   \verb+]+. You can replace most of the cases by the identity tactic just to
1003   concentrate only on the first goal, but you will have to go one step back and
1004   one further every time you add something inside the tactical. And if you are
1005   boared of doing so, you will finish in giving up structuring the proof and
1006   write a plain list of tactics.\\
1007   With step-by-step tacticals you can apply the induction principle, and just
1008   open the branching tactical \verb+[+. Then you can interact with the system
1009   reaching a proof of the first case, without having to specify the whole
1010   branching tactical. When you have proved all the induction cases, you close
1011   the branching tactical with \verb+]+ and you are done with a structured proof.
1012 \item[Rereading]
1013   is possible. Going on step by step shows exactly what is going on.
1014   Consider again a proof by induction, that starts applying the induction
1015   principle and suddenly baranches with a \verb+[+. This clearly separates all
1016   the induction cases, but if the square brackets content is executed in one
1017   single step you completely loose the possibility of rereading it. Again,
1018   executing step-by-step is the way you whould like to review the
1019   demonstration. Remember tha understandig the proof from the script is not
1020   easy, and only the execution of tactics (and the resulting transformed goal)
1021   gives you the feeling of what is goning on.
1022 \end{description}
1023
1024
1025
1026 \subsection{named variable e disambiguazione lazy}
1027 \ASSIGNEDTO{csc}
1028
1029 \subsection{metavariabili}
1030 \label{sec:metavariables}
1031 \ASSIGNEDTO{csc}
1032
1033 \begin{verbatim}
1034
1035 \end{verbatim}
1036
1037 \section{Drawbacks, missing, \dots}
1038
1039 \subsection{moduli}
1040 \ASSIGNEDTO{}
1041
1042 \subsection{ltac}
1043 \ASSIGNEDTO{}
1044
1045 \subsection{estrazione}
1046 \ASSIGNEDTO{}
1047
1048 \subsection{localizzazione errori}
1049 \ASSIGNEDTO{}
1050
1051 \acknowledgements
1052 We would like to thank all the students that during the past
1053 five years collaborated in the \HELM{} project and contributed to 
1054 the development of Matita, and in particular
1055 A.Griggio, F.Guidi, P. Di Lena, L.Padovani, I.Schena, M.Selmi, 
1056 V.Tamburrelli.
1057
1058 \theendnotes
1059
1060 \bibliography{matita}
1061
1062
1063 \end{document}
1064