aboutsummaryrefslogtreecommitdiff
path: root/dev/doc/newsyntax.tex
diff options
context:
space:
mode:
authorThéo Zimmermann2019-03-15 13:32:36 +0100
committerThéo Zimmermann2019-03-15 13:32:36 +0100
commit0063c4c985078fd181c4a3a149ccbb06752edc97 (patch)
treebfc3d7dc243a921643e6ceb42bdcb2522a412053 /dev/doc/newsyntax.tex
parent710a7cad94dcc9c734ab9ccc425f7a080dddc5f8 (diff)
Remove clutter by moving historic unmaintained dev/doc files to an archive subfolder.
Diffstat (limited to 'dev/doc/newsyntax.tex')
-rw-r--r--dev/doc/newsyntax.tex725
1 files changed, 0 insertions, 725 deletions
diff --git a/dev/doc/newsyntax.tex b/dev/doc/newsyntax.tex
deleted file mode 100644
index d1986fa0d1..0000000000
--- a/dev/doc/newsyntax.tex
+++ /dev/null
@@ -1,725 +0,0 @@
-
-%% -*-french-tex-*-
-
-\documentclass{article}
-
-\usepackage{verbatim}
-\usepackage[T1]{fontenc}
-\usepackage[utf8]{inputenc}
-\usepackage[french]{babel}
-\usepackage{amsmath}
-\usepackage{amssymb}
-\usepackage{array}
-
-
-\author{B.~Barras}
-\title{Proposition de syntaxe pour Coq}
-
-%% Le _ est un caractère normal
-\catcode`\_=13
-\let\subscr=_
-\def_{\ifmmode\sb\else\subscr\fi}
-
-%% Macros pour les grammaires
-\def\NT#1{\langle\textit{#1}\rangle}
-\def\TERM#1{\textsf{#1}}
-\def\STAR#1{#1\!*}
-\def\PLUS#1{#1\!+}
-
-%% Tableaux de definition de non-terminaux
-\newenvironment{cadre}
- {\begin{array}{|c|}\hline\\}
- {\\\\\hline\end{array}}
-\newenvironment{rulebox}
- {$$\begin{cadre}\begin{array}{r@{~}c@{~}l@{}r}}
- {\end{array}\end{cadre}$$}
-\def\DEFNT#1{\NT{#1} & ::= &}
-\def\EXTNT#1{\NT{#1} & ::= & ... \\&|&}
-\def\RNAME#1{(\textsc{#1})}
-\def\SEPDEF{\\\\}
-\def\nlsep{\\&|&}
-
-
-\begin{document}
-
-\maketitle
-
-\section{Grammaire des tactiques}
-\label{tacticsyntax}
-
-La réflexion de la rénovation de la syntaxe des tactiques n'est pas
-encore aussi poussée que pour les termes (section~\ref{constrsyntax}),
-mais cette section vise à énoncer les quelques principes que l'on
-souhaite suivre.
-
-\begin{itemize}
-\item Réutiliser les mots-clés de la syntaxe des termes (i.e. en
- minuscules) pour les constructions similaires de tactiques (let_in,
- match, and, etc.). Le connecteur logique \texttt{and} n'étant que
- rarement utilisé autrement que sous la forme \texttt{$\wedge$} (sauf
- dans le code ML), on pourrait dégager ce mot-clé.
-\item Les arguments passés aux tactiques sont principalement des
- termes, on préconise l'utilisation d'un symbole spécial (par exemple
- l'apostrophe) pour passer une tactique ou une expression
- (AST). L'idée étant que l'on écrit plus souvent des tactiques
- prenant des termes en argument que des tacticals.
-\end{itemize}
-
-\begin{figure}
-\begin{rulebox}
-\DEFNT{tactic}
- \NT{tactic} ~\TERM{\&} ~\NT{tactic} & \RNAME{then}
-\nlsep \TERM{[} ~\NT{tactic}~\TERM{|}~...
- ~\TERM{|}~\NT{tactic}~\TERM{]} & \RNAME{par}
-\nlsep \NT{ident} ~\STAR{\NT{tactic-arg}} ~~~ & \RNAME{apply}
-\nlsep \TERM{fun} ~.... & \RNAME{function}
-\nlsep \NT{simple-tactic}
-\SEPDEF
-\DEFNT{tactic-arg}
- \NT{constr}
-\nlsep \TERM{'} ~\NT{tactic}
-\SEPDEF
-\DEFNT{simple-tactic}
- \TERM{Apply} ~\NT{binding-term}
-\nlsep \NT{elim-kw} ~\NT{binding-term}
-\nlsep \NT{elim-kw} ~\NT{binding-term} ~\TERM{using} ~\NT{binding-term}
-\nlsep \TERM{Intros} ~\NT{intro-pattern}
-\SEPDEF
-\DEFNT{elim-kw}
- \TERM{Elim} ~\mid~ \TERM{Case} ~\mid~ \TERM{Induction}
- ~\mid~ \TERM{Destruct}
-\end{rulebox}
-\caption{Grammaire des tactiques}
-\label{tactic}
-\end{figure}
-
-
-\subsection{Arguments de tactiques}
-
-La syntaxe actuelle des arguments de tactiques est que l'on parse par
-défaut une expression de tactique, ou bien l'on parse un terme si
-celui-ci est préfixé par \TERM{'} (sauf dans le cas des
-variables). Cela est gênant pour les utilisateurs qui doivent écrire
-des \TERM{'} pour leurs tactiques.
-
-À mon avis, il n'est pas souhaitable pour l'utilisateur de l'obliger à
-marquer une différence entre les tactiques ``primitives'' (en fait
-``système'') et les tactiques définies par Ltac. En effet, on se
-dirige inévitablement vers une situation où il existera des librairies
-de tactiques et il va devenir difficile de savoir facilement s'il faut
-ou non mettre des \TERM{'}.
-
-
-
-\subsection{Bindings}
-
-Dans un premier temps, les ``bindings'' sont toujours considérés comme
-une construction du langage des tactiques, mais il est intéressant de
-prévoir l'extension de ce procédé aux termes, puisqu'il s'agit
-simplement de construire un n{\oe}ud d'application dans lequel on
-donne les arguments par nom ou par position, les autres restant à
-inférer. Le principal point est de trouver comment combiner de manière
-uniforme ce procédé avec les arguments implicites.
-
-Il est toutefois important de réfléchir dès maintenant à une syntaxe
-pour éviter de rechanger encore la syntaxe.
-
-Intégrer la notation \TERM{with} aux termes peut poser des problèmes
-puisque ce mot-clé est utilisé pour le filtrage: comment parser (en
-LL(1)) l'expression:
-\begin{verbatim}
-Cases x with y ...
-\end{verbatim}
-
-Soit on trouve un autre mot-clé, soit on joue avec les niveaus de
-priorité en obligeant a parenthéser le \TERM{with} des ``bindings'':
-\begin{verbatim}
-Cases (x with y) with (C z) => ...
-\end{verbatim}
-ce qui introduit un constructeur moralement équivalent à une
-application situé à une priorité totalement différente (les
-``bindings'' seraient au plus haut niveau alors que l'application est
-à un niveau bas).
-
-
-\begin{figure}
-\begin{rulebox}
-\DEFNT{binding-term}
- \NT{constr} ~\TERM{with} ~\STAR{\NT{binding}}
-\SEPDEF
-\DEFNT{binding}
- \NT{constr}
-\end{rulebox}
-\caption{Grammaire des bindings}
-\label{bindings}
-\end{figure}
-
-\subsection{Enregistrements}
-
-Il faudrait aménager la syntaxe des enregistrements dans l'optique
-d'avoir des enregistrements anonymes (termes de première classe), même
-si pour l'instant, on ne dispose que d'enregistrements définis a
-toplevel.
-
-Exemple de syntaxe pour les types d'enregistrements:
-\begin{verbatim}
-{ x1 : A1;
- x2 : A2(x1);
- _ : T; (* Pas de projection disponible *)
- y; (* Type infere *)
- ... (* ; optionnel pour le dernier champ *)
-}
-\end{verbatim}
-
-Exemple de syntaxe pour le constructeur:
-\begin{verbatim}
-{ x1 = O;
- x2 : A2(x1) = v1;
- _ = v2;
- ...
-}
-\end{verbatim}
-Quant aux dépendences, une convention pourrait être de considérer les
-champs non annotés par le type comme non dépendants.
-
-Plusieurs interrogations:
-\begin{itemize}
-\item l'ordre des champs doit-il être respecté ?
- sinon, que faire pour les champs sans projection ?
-\item autorise-t-on \texttt{v1} a mentionner \texttt{x1} (comme dans
- la définition d'un module), ce qui se comporterait comme si on avait
- écrit \texttt{v1} à la place. Cela pourrait être une autre manière
- de déclarer les dépendences
-\end{itemize}
-
-La notation pointée pour les projections pose un problème de parsing,
-sauf si l'on a une convention lexicale qui discrimine les noms de
-modules des projections et identificateurs: \texttt{x.y.z} peut être
-compris comme \texttt{(x.y).z} ou texttt{x.(y.z)}.
-
-
-\section{Grammaire des termes}
-\label{constrsyntax}
-
-\subsection{Quelques principes}
-
-\begin{enumerate}
-\item Diminuer le nombre de niveaux de priorité en regroupant les
- règles qui se ressemblent: infixes, préfixes, lieurs (constructions
- ouvertes à droite), etc.
-\item Éviter de surcharger la signification d'un symbole (ex:
- \verb+( )+ comme parenthésage et produit dans la V7).
-\item Faire en sorte que les membres gauches (motifs de Cases, lieurs
- d'abstraction ou de produits) utilisent une syntaxe compatible avec
- celle des membres droits (branches de Cases et corps de fonction).
-\end{enumerate}
-
-\subsection{Présentation de la grammaire}
-
-\begin{figure}
-\begin{rulebox}
-\DEFNT{paren-constr}
- \NT{cast-constr}~\TERM{,}~\NT{paren-constr} &\RNAME{pair}
-\nlsep \NT{cast-constr}
-\SEPDEF
-\DEFNT{cast-constr}
- \NT{constr}~\TERM{\!\!:}~\NT{cast-constr} &\RNAME{cast}
-\nlsep \NT{constr}
-\SEPDEF
-\DEFNT{constr}
- \NT{appl-constr}~\NT{infix}~\NT{constr} &\RNAME{infix}
-\nlsep \NT{prefix}~\NT{constr} &\RNAME{prefix}
-\nlsep \NT{constr}~\NT{postfix} &\RNAME{postfix}
-\nlsep \NT{appl-constr}
-\SEPDEF
-\DEFNT{appl-constr}
- \NT{appl-constr}~\PLUS{\NT{appl-arg}} &\RNAME{apply}
-\nlsep \TERM{@}~\NT{global}~\PLUS{\NT{simple-constr}} &\RNAME{expl-apply}
-\nlsep \NT{simple-constr}
-\SEPDEF
-\DEFNT{appl-arg}
- \TERM{@}~\NT{int}~\TERM{\!:=}~\NT{simple-constr} &\RNAME{impl-arg}
-\nlsep \NT{simple-constr}
-\SEPDEF
-\DEFNT{simple-constr}
- \NT{atomic-constr}
-\nlsep \TERM{(}~\NT{paren-constr}~\TERM{)}
-\nlsep \NT{match-constr}
-\nlsep \NT{fix-constr}
-%% \nlsep \TERM{<\!\!:ast\!\!:<}~\NT{ast}~\TERM{>\!>} &\RNAME{quotation}
-\end{rulebox}
-\caption{Grammaire des termes}
-\label{constr}
-\end{figure}
-
-\begin{figure}
-\begin{rulebox}
-\DEFNT{prefix}
- \TERM{!}~\PLUS{\NT{binder}}~\TERM{.}~ &\RNAME{prod}
-\nlsep \TERM{fun} ~\PLUS{\NT{binder}} ~\TERM{$\Rightarrow$} &\RNAME{lambda}
-\nlsep \TERM{let}~\NT{ident}~\STAR{\NT{binder}} ~\TERM{=}~\NT{constr}
- ~\TERM{in} &\RNAME{let}
-%\nlsep \TERM{let (}~\NT{comma-ident-list}~\TERM{) =}~\NT{constr}
-% ~\TERM{in} &~~~\RNAME{let-case}
-\nlsep \TERM{if}~\NT{constr}~\TERM{then}~\NT{constr}~\TERM{else}
- &\RNAME{if-case}
-\nlsep \TERM{eval}~\NT{red-fun}~\TERM{in} &\RNAME{eval}
-\SEPDEF
-\DEFNT{infix}
- \TERM{$\rightarrow$} & \RNAME{impl}
-\SEPDEF
-\DEFNT{atomic-constr}
- \TERM{_}
-\nlsep \TERM{?}\NT{int}
-\nlsep \NT{sort}
-\nlsep \NT{global}
-\SEPDEF
-\DEFNT{binder}
- \NT{ident} &\RNAME{infer}
-\nlsep \TERM{(}~\NT{ident}~\NT{type}~\TERM{)} &\RNAME{binder}
-\SEPDEF
-\DEFNT{type}
- \TERM{\!:}~\NT{constr}
-\nlsep \epsilon
-\end{rulebox}
-\caption{Grammaires annexes aux termes}
-\label{gram-annexes}
-\end{figure}
-
-La grammaire des termes (correspondant à l'état \texttt{barestate})
-est décrite figures~\ref{constr} et~\ref{gram-annexes}. On constate
-par rapport aux précédentes versions de Coq d'importants changements
-de priorité, le plus marquant étant celui de l'application qui se
-trouve désormais juste au dessus\footnote{La convention est de
-considérer les opérateurs moins lieurs comme ``au dessus'',
-c'est-à-dire ayant un niveau de priorité plus élévé (comme c'est le
-cas avec le niveau de la grammaire actuelle des termes).} des
-constructions fermées à gauche et à droite.
-
-La grammaire des noms globaux est la suivante:
-\begin{eqnarray*}
-\DEFNT{global}
- \NT{ident}
-%% \nlsep \TERM{\$}\NT{ident}
-\nlsep \NT{ident}\TERM{.}\NT{global}
-\end{eqnarray*}
-
-Le $\TERM{_}$ dénote les termes à synthétiser. Les métavariables sont
-reconnues au niveau du lexer pour ne pas entrer en conflit avec le
-$\TERM{?}$ de l'existentielle.
-
-Les opérateurs infixes ou préfixes sont tous au même niveau de
-priorité du point de vue de Camlp4. La solution envisagée est de les
-gérer à la manière de Yacc, avec une pile (voir discussions plus
-bas). Ainsi, l'implication est un infixe normal; la quantification
-universelle et le let sont vus comme des opérateurs préfixes avec un
-niveau de priorité plus haut (i.e. moins lieur). Il subsiste des
-problèmes si l'on ne veut pas écrire de parenthèses dans:
-\begin{verbatim}
- A -> (!x. B -> (let y = C in D))
-\end{verbatim}
-
-La solution proposée est d'analyser le membre droit d'un infixe de
-manière à autoriser les préfixes et les infixes de niveau inférieur,
-et d'exiger le parenthésage que pour les infixes de niveau supérieurs.
-
-En revanche, à l'affichage, certains membres droits seront plus
-lisibles s'ils n'utilisent pas cette astuce:
-\begin{verbatim}
-(fun x => x) = fun x => x
-\end{verbatim}
-
-La proposition est d'autoriser ce type d'écritures au parsing, mais
-l'afficheur écrit de manière standardisée en mettant quelques
-parenthèses superflues: $\TERM{=}$ serait symétrique alors que
-$\rightarrow$ appellerait l'afficheur de priorité élevée pour son
-sous-terme droit.
-
-Les priorités des opérateurs primitifs sont les suivantes (le signe
-$*$ signifie que pour le membre droit les opérateurs préfixes seront
-affichés sans parenthèses quel que soit leur priorité):
-$$
-\begin{array}{c|l}
-$symbole$ & $priorité$ \\
-\hline
-\TERM{!} & 200\,R* \\
-\TERM{fun} & 200\,R* \\
-\TERM{let} & 200\,R* \\
-\TERM{if} & 200\,R \\
-\TERM{eval} & 200\,R \\
-\rightarrow & 90\,R*
-\end{array}
-$$
-
-Il y a deux points d'entrée pour les termes: $\NT{constr}$ et
-$\NT{simple-constr}$. Le premier peut être utilisé lorsqu'il est suivi
-d'un séparateur particulier. Dans le cas où l'on veut une liste de
-termes séparés par un espace, il faut lire des $\NT{simple-constr}$.
-
-
-
-Les constructions $\TERM{fix}$ et $\TERM{cofix}$ (voir aussi
-figure~\ref{gram-fix}) sont fermées par end pour simplifier
-l'analyse. Sinon, une expression de point fixe peut être suivie par un
-\TERM{in} ou un \TERM{and}, ce qui pose les mêmes problèmes que le
-``dangling else'': dans
-\begin{verbatim}
-fix f1 x {x} = fix f2 y {y} = ... and ... in ...
-\end{verbatim}
-il faut définir une stratégie pour associer le \TERM{and} et le
-\TERM{in} au bon point fixe.
-
-Un autre avantage est de faire apparaitre que le \TERM{fix} est un
-constructeur de terme de première classe et pas un lieur:
-\begin{verbatim}
-fix f1 ... and f2 ...
-in f1 end x
-\end{verbatim}
-Les propositions précédentes laissaient \texttt{f1} et \texttt{x}
-accolés, ce qui est source de confusion lorsque l'on fait par exemple
-\texttt{Pattern (f1 x)}.
-
-Les corps de points fixes et co-points fixes sont identiques, bien que
-ces derniers n'aient pas d'information de décroissance. Cela
-fonctionne puisque l'annotation est optionnelle. Cela préfigure des
-cas où l'on arrive à inférer quel est l'argument qui décroit
-structurellement (en particulier dans le cas où il n'y a qu'un seul
-argument).
-
-\begin{figure}
-\begin{rulebox}
-\DEFNT{fix-expr}
- \TERM{fix}~\NT{fix-decls} ~\NT{fix-select} ~\TERM{end} &\RNAME{fix}
-\nlsep \TERM{cofix}~\NT{cofix-decls}~\NT{fix-select} ~\TERM{end} &\RNAME{cofix}
-\SEPDEF
-\DEFNT{fix-decls}
- \NT{fix-decl}~\TERM{and}~\NT{fix-decls}
-\nlsep \NT{fix-decl}
-\SEPDEF
-\DEFNT{fix-decl}
- \NT{ident}~\PLUS{\NT{binder}}~\NT{type}~\NT{annot}
- ~\TERM{=}~\NT{constr}
-\SEPDEF
-\DEFNT{annot}
- \TERM{\{}~\NT{ident}~\TERM{\}}
-\nlsep \epsilon
-\SEPDEF
-\DEFNT{fix-select}
- \TERM{in}~\NT{ident}
-\nlsep \epsilon
-\end{rulebox}
-\caption{Grammaires annexes des points fixes}
-\label{gram-fix}
-\end{figure}
-
-La construction $\TERM{Case}$ peut-être considérée comme
-obsolète. Quant au $\TERM{Match}$ de la V6, il disparaît purement et
-simplement.
-
-\begin{figure}
-\begin{rulebox}
-\DEFNT{match-expr}
- \TERM{match}~\NT{case-items}~\NT{case-type}~\TERM{with}~
- \NT{branches}~\TERM{end} &\RNAME{match}
-\nlsep \TERM{match}~\NT{case-items}~\TERM{with}~
- \NT{branches}~\TERM{end} &\RNAME{infer-match}
-%%\nlsep \TERM{case}~\NT{constr}~\NT{case-predicate}~\TERM{of}~
-%% \STAR{\NT{constr}}~\TERM{end} &\RNAME{case}
-\SEPDEF
-\DEFNT{case-items}
- \NT{case-item} ~\TERM{\&} ~\NT{case-items}
-\nlsep \NT{case-item}
-\SEPDEF
-\DEFNT{case-item}
- \NT{constr}~\NT{pred-pattern} &\RNAME{dep-case}
-\nlsep \NT{constr} &\RNAME{nodep-case}
-\SEPDEF
-\DEFNT{case-type}
- \TERM{$\Rightarrow$}~\NT{constr}
-\nlsep \epsilon
-\SEPDEF
-\DEFNT{pred-pattern}
- \TERM{as}~\NT{ident} ~\TERM{\!:}~\NT{constr}
-\SEPDEF
-\DEFNT{branches}
- \TERM{|} ~\NT{patterns} ~\TERM{$\Rightarrow$}
- ~\NT{constr} ~\NT{branches}
-\nlsep \epsilon
-\SEPDEF
-\DEFNT{patterns}
- \NT{pattern} ~\TERM{\&} ~\NT{patterns}
-\nlsep \NT{pattern}
-\SEPDEF
-\DEFNT{pattern} ...
-\end{rulebox}
-\caption{Grammaires annexes du filtrage}
-\label{gram-match}
-\end{figure}
-
-De manière globale, l'introduction de définitions dans les termes se
-fait avec le symbole $=$, et le $\!:=$ est réservé aux définitions au
-niveau vernac. Il y avait un manque de cohérence dans la
-V6, puisque l'on utilisait $=$ pour le $\TERM{let}$ et $\!:=$ pour les
-points fixes et les commandes vernac.
-
-% OBSOLETE: lieurs multiples supprimes
-%On peut remarquer que $\NT{binder}$ est un sous-ensemble de
-%$\NT{simple-constr}$, à l'exception de $\texttt{(a,b\!\!:T)}$: en tant
-%que lieur, {\tt a} et {\tt b} sont tous deux contraints, alors qu'en
-%tant que terme, seul {\tt b} l'est. Cela qui signifie que l'objectif
-%de rendre compatibles les membres gauches et droits est {\it presque}
-%atteint.
-
-\subsection{Infixes}
-
-\subsubsection{Infixes extensibles}
-
-Le problème de savoir si la liste des symboles pouvant apparaître en
-infixe est fixée ou extensible par l'utilisateur reste à voir.
-
-Notons que la solution où les symboles infixes sont des
-identificateurs que l'on peut définir paraît difficilement praticable:
-par exemple $\texttt{Logic.eq}$ n'est pas un opérateur binaire, mais
-ternaire. Il semble plus simple de garder des déclarations infixes qui
-relient un symbole infixe à un terme avec deux ``trous''. Par exemple:
-
-$$\begin{array}{c|l}
-$infixe$ & $identificateur$ \\
-\hline
-= & \texttt{Logic.eq _ ?1 ?2} \\
-== & \texttt{JohnMajor.eq _ ?1 _ ?2}
-\end{array}$$
-
-La syntaxe d'une déclaration d'infixe serait par exemple:
-\begin{verbatim}
-Infix "=" 50 := Logic.eq _ ?1 ?2;
-\end{verbatim}
-
-
-\subsubsection{Gestion des précédences}
-
-Les infixes peuvent être soit laissé à Camlp4, ou bien (comme ici)
-considérer que tous les opérateurs ont la même précédence et gérer
-soit même la recomposition des termes à l'aide d'une pile (comme
-Yacc).
-
-
-\subsection{Extensions de syntaxe}
-
-\subsubsection{Litéraux numériques}
-
-La proposition est de considerer les litéraux numériques comme de
-simples identificateurs. Comme il en existe une infinité, il faut un
-nouveau mécanisme pour leur associer une définition. Par exemple, en
-ce qui concerne \texttt{Arith}, la définition de $5$ serait
-$\texttt{S}~4$. Pour \texttt{ZArith}, $5$ serait $\texttt{xI}~2$.
-
-Comme les infixes, les constantes numériques peuvent être qualifiées
-pour indiquer dans quels module est le type que l'on veut
-référencer. Par exemple (si on renomme \texttt{Arith} en \texttt{N} et
-\texttt{ZArith} en \texttt{Z}): \verb+N.5+, \verb+Z.5+.
-
-\begin{eqnarray*}
-\EXTNT{global}
- \NT{int}
-\end{eqnarray*}
-
-\subsubsection{Nouveaux lieurs}
-
-$$
-\begin{array}{rclr}
-\EXTNT{constr}
- \TERM{ex}~\PLUS{\NT{binder}}~\TERM{.}~\NT{constr} &\RNAME{ex}
-\nlsep \TERM{ex}~\PLUS{\NT{binder}}~\TERM{.}~\NT{constr}~\TERM{,}~\NT{constr}
- &\RNAME{ex2}
-\nlsep \TERM{ext}~\PLUS{\NT{binder}}~\TERM{.}~\NT{constr} &\RNAME{exT}
-\nlsep \TERM{ext}~\PLUS{\NT{binder}}~\TERM{.}~\NT{constr}~\TERM{,}~\NT{constr}
- &\RNAME{exT2}
-\end{array}
-$$
-
-Pour l'instant l'existentielle n'admet qu'une seule variable, ce qui
-oblige à écrire des cascades de $\TERM{ex}$.
-
-Pour parser les existentielles avec deux prédicats, on peut considérer
-\TERM{\&} comme un infixe intermédiaire et l'opérateur existentiel en
-présence de cet infixe se transforme en \texttt{ex2}.
-
-\subsubsection{Nouveaux infixes}
-
-Précédences des opérateurs infixes (les plus grands associent moins fort):
-$$
-\begin{array}{l|l|c|l}
-$identificateur$ & $module$ & $infixe/préfixe$ & $précédence$ \\
-\hline
-\texttt{iff} & $Logic$ & \longleftrightarrow & 100 \\
-\texttt{or} & $Logic$ & \vee & 80\, R \\
-\texttt{sum} & $Datatypes$ & + & 80\, R \\
-\texttt{and} & $Logic$ & \wedge & 70\, R \\
-\texttt{prod} & $Datatypes$ & * & 70\, R \\
-\texttt{not} & $Logic$ & \tilde{} & 60\, L \\
-\texttt{eq _} & $Logic$ & = & 50 \\
-\texttt{eqT _} & $Logic_Type$ & = & 50 \\
-\texttt{identityT _} & $Data_Type$ & = & 50 \\
-\texttt{le} & $Peano$ & $<=$ & 50 \\
-\texttt{lt} & $Peano$ & $<$ & 50 \\
-\texttt{ge} & $Peano$ & $>=$ & 50 \\
-\texttt{gt} & $Peano$ & $>$ & 50 \\
-\texttt{Zle} & $zarith_aux$ & $<=$ & 50 \\
-\texttt{Zlt} & $zarith_aux$ & $<$ & 50 \\
-\texttt{Zge} & $zarith_aux$ & $>=$ & 50 \\
-\texttt{Zgt} & $zarith_aux$ & $>$ & 50 \\
-\texttt{Rle} & $Rdefinitions$ & $<=$ & 50 \\
-\texttt{Rlt} & $Rdefinitions$ & $<$ & 50 \\
-\texttt{Rge} & $Rdefinitions$ & $>=$ & 50 \\
-\texttt{Rgt} & $Rdefinitions$ & $>$ & 50 \\
-\texttt{plus} & $Peano$ & + & 40\,L \\
-\texttt{Zplus} & $fast_integer$ & + & 40\,L \\
-\texttt{Rplus} & $Rdefinitions$ & + & 40\,L \\
-\texttt{minus} & $Minus$ & - & 40\,L \\
-\texttt{Zminus} & $zarith_aux$ & - & 40\,L \\
-\texttt{Rminus} & $Rdefinitions$ & - & 40\,L \\
-\texttt{Zopp} & $fast_integer$ & - & 40\,L \\
-\texttt{Ropp} & $Rdefinitions$ & - & 40\,L \\
-\texttt{mult} & $Peano$ & * & 30\,L \\
-\texttt{Zmult} & $fast_integer$ & * & 30\,L \\
-\texttt{Rmult} & $Rdefinitions$ & * & 30\,L \\
-\texttt{Rdiv} & $Rdefinitions$ & / & 30\,L \\
-\texttt{pow} & $Rfunctions$ & \hat & 20\,L \\
-\texttt{fact} & $Rfunctions$ & ! & 20\,L \\
-\end{array}
-$$
-
-Notons qu'il faudrait découper {\tt Logic_Type} en deux car celui-ci
-définit deux égalités, ou alors les mettre dans des modules différents.
-
-\subsection{Exemples}
-
-\begin{verbatim}
-Definition not (A:Prop) := A->False;
-Inductive eq (A:Set) (x:A) : A->Prop :=
- refl_equal : eq A x x;
-Inductive ex (A:Set) (P:A->Prop) : Prop :=
- ex_intro : !x. P x -> ex A P;
-Lemma not_all_ex_not : !(P:U->Prop). ~(!n. P n) -> ?n. ~ P n;
-Fixpoint plus n m : nat {struct n} :=
- match n with
- O => m
- | (S k) => S (plus k m)
- end;
-\end{verbatim}
-
-\subsection{Questions ouvertes}
-
-Voici les points sur lesquels la discussion est particulièrement
-ouverte:
-\begin{itemize}
-\item choix d'autres symboles pour les quantificateurs \TERM{!} et
- \TERM{?}. En l'état actuel des discussions, on garderait le \TERM{!}
- pour la qunatification universelle, mais on choisirait quelquechose
- comme \TERM{ex} pour l'existentielle, afin de ne pas suggérer trop
- de symétrie entre ces quantificateurs (l'un est primitif, l'autre
- pas).
-\item syntaxe particulière pour les \texttt{sig}, \texttt{sumor}, etc.
-\item la possibilité d'introduire plusieurs variables du même type est
- pour l'instant supprimée au vu des problèmes de compatibilité de
- syntaxe entre les membres gauches et membres droits. L'idée étant
- que l'inference de type permet d'éviter le besoin de déclarer tous
- les types.
-\end{itemize}
-
-\subsection{Autres extensions}
-
-\subsubsection{Lieur multiple}
-
-L'écriture de types en présence de polymorphisme est souvent assez
-pénible:
-\begin{verbatim}
-Check !(A:Set) (x:A) (B:Set) (y:B). P A x B y;
-\end{verbatim}
-
-On pourrait avoir des déclarations introduisant à la fois un type
-d'une certaine sorte et une variable de ce type:
-\begin{verbatim}
-Check !(x:A:Set) (y:B:Set). P A x B y;
-\end{verbatim}
-
-Noter que l'on aurait pu écrire:
-\begin{verbatim}
-Check !A x B y. P A (x:A:Set) B (y:B:Set);
-\end{verbatim}
-
-\section{Syntaxe des tactiques}
-
-\subsection{Questions diverses}
-
-Changer ``Pattern nl c ... nl c'' en ``Pattern [ nl ] c ... [ nl ] c''
-pour permettre des chiffres seuls dans la catégorie syntaxique des
-termes.
-
-Par uniformité remplacer ``Unfold nl c'' par ``Unfold [ nl ] c'' ?
-
-Même problème pour l'entier de Specialize (ou virer Specialize ?) ?
-
-\subsection{Questions en suspens}
-
-\verb=EAuto= : deux syntaxes différentes pour la recherche en largeur
-et en profondeur ? Quelle recherche par défaut ?
-
-\section*{Remarques pêle-mêle (HH)}
-
-Autoriser la syntaxe
-
-\begin{verbatim}
-Variable R (a : A) (b : B) : Prop.
-Hypotheses H (a : A) (b : B) : Prop; Y (u : U) : V.
-Variables H (a : A) (b : B), J (k : K) : nat; Z (v : V) : Set.
-\end{verbatim}
-
-Renommer eqT, refl_eqT, eqT_ind, eqT_rect, eqT_rec en eq, refl_equal, etc.
-Remplacer == en =.
-
-Mettre des \verb=?x= plutot que des \verb=?1= dans les motifs de ltac ??
-
-\section{Moulinette}
-
-\begin{itemize}
-
-\item Mettre \verb=/= et * au même niveau dans R.
-
-\item Changer la précédence du - unaire dans R.
-
-\item Ajouter Require Arith par necessite si Require ArithRing ou Require ZArithRing.
-
-\item Ajouter Require ZArith par necessite si Require ZArithRing ou Require Omega.
-
-\item Enlever le Export de Bool, Arith et ZARith de Ring quand inapproprié et
-l'ajouter à côté des Require Ring.
-
-\item Remplacer "Check n" par "n:Check ..."
-
-\item Renommer Variable/Hypothesis hors section en Parameter/Axiom.
-
-\item Renommer les \verb=command0=, \verb=command1=, ... \verb=lcommand= etc en
-\verb=constr0=, \verb=constr1=, ... \verb=lconstr=.
-
-\item Remplacer les noms Coq.omega.Omega par Coq.Omega ...
-
-\item Remplacer AddPath par Add LoadPath (ou + court)
-
-\item Unify + and \{\}+\{\} and +\{\} using Prop $\leq$ Set ??
-
-\item Remplacer Implicit Arguments On/Off par Set/Unset Implicit Arguments.
-
-\item La syntaxe \verb=Intros (a,b)= est inutile, \verb=Intros [a b]= fait l'affaire.
-
-\item Virer \verb=Goal= sans argument (synonyme de \verb=Proof= et sans effets).
-
-\item Remplacer Save. par Qed.
-
-\item Remplacer \verb=Zmult_Zplus_distr= par \verb=Zmult_plus_distr_r=
-et \verb=Zmult_plus_distr= par \verb=Zmult_plus_distr_l=.
-
-\end{itemize}
-
-\end{document}