aboutsummaryrefslogtreecommitdiffhomepage
path: root/doc/discussion-syntaxe.txt
blob: 658c67c721ad65568436ffab1cf74c3b647395b3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349

  Synthèse des différentes propositions de "rénovation" de la syntaxe de Coq
  --------------------------------------------------------------------------

I) Constructions

   Éléments de doctrine : 

   - choix de mots-clés en minuscule
   - proche de ml

A) Produit

  Consensus apparent pour remplacer la syntaxe actuelle à base de
parenthèses par quelque chose de plus "simple". Les options retenues
sont "! x . P x", "Forall x . P x" ou "forall x . P x".

  A1) Choix du symbole de tête

  "!" est court et expressif mais sans doute moins que "forall"
  surtout pour un débutant. "!", c'est le choix d'HOL, "forall" (en
  majuscule), celui de PVS. Un inconvénient de "forall" est qu'il
  n'est pas très approprié pour le produit fonctionnel dépendant (ou
  alors, on propose à la fois "pi" et "forall" comme synonymes)

  Rem: Quelque soit le choix du symbole de tête, un parseur/printeur
  unicode pourra substituer le symbole de tête par le "\forall" (et le
  "\pi" dans l'option ou "pi" et "forall" coexistent)


  A2) Quantification sur plusieurs variables

  A2a) "! x y1 z. P x"

  Avantages : analogie avec la juxtaposition des arguments pour l'application,
  réminiscent de la juxtaposition en math "\forall xyz.P(x)", c'est le
  choix d'HOL.

  A2b) "! x, y1, z. P x"

  Avantages : plus standard ?


  A3) Mention des types

  A3a) On a séparé par des espaces

  A3a1) "! ( x x1 : A ) ( y1 y2 : f a ( g b ) ) z. P x"
  A3a2) "! x x1 : A, y1 y2 : f a ( g b ), z. P x"
  A3a3) "! x x1 : A; y1 y2 : f a ( g b ); z. P x"
  A3a4) "! x x1 : A. ! y1 y2 : f a ( g b ). ! z. P x"
    Rem: ici, un seul type explicite par quantificateur; mais incohérence
    avec "! x y. P x" où x et y peuvent avoir des types différente; en
    revanche, se comporte bien à l'écriture sur plusieurs lignes

  A3b) On a séparé par des virgules

  A3b1) "! ( x, x1 : A ), ( y1, y2 : f a ( g b ) ), z. P x"
  A3b2) "! x, x1 : A, y1 y2 : f a ( g b ), z. P x"
  A3b3) "! x, x1 : A; y1 y2 : f a ( g b ); z. P x"
  A3b4) "! x, x1 : A. ! y1 y2 : f a ( g b ) . ! z. P x"

  Rem: si ";" voir section terminateur de phrase


B) Application

  Pas d'apparence de consensus

  B1) Principe que les parenthèses font partie de la notation
  (appliqué par une partie de la communauté \-calcul et dans Lisp),

  B2) Principe que les parenthèses ne servent qu'à grouper
  (appliqué par une partie de la communauté \-calcul et dans ML)

  Argument : notations plus légères, cohérence avec ML

  Ce choix implique-t-il de donner la plus grande précédence à l'application ?
  Exemple : comment comprendre ces expressions ?

  f 4 + x
  P A -> B
  ! x : f a = b c . h y 


C) Abstraction

  Tant qu'à faire, renoncement à la notation crochet pour obtenir une
meilleure cohérence avec le reste.

  C1) "\ x. g y" ou "fun x. g y"  (analogie avec "!" ou "forall")
  C2) "fun x => g y" ou "Fun x => g y" (analogie avec caml et le filtrage)
  C3) "\ x => g y" (réminiscent de Haskell)


D) Arithmétique

  Consensus pour réserver 0, 1, 2, ... ainsi que +, -, *, /, < et > à
l'arithmétique. Tant qu'à faire, >=, <= et <> aussi (l'usage en est
standard).

  Trois approches ont été proposées pour distinguer l'algèbre
concernée (N, Z, R, ...).

  D1) Qualification des opérateurs, qui obéissent alors aux mêmes règles
que des identificateurs concernant la surcharge (càd le dernier module
"importé" ("ouvert" au sens ML) impose ses noms et symboles. Ex:

  Require Arith.  (* + est l'addition sur les naturels *)
  Require ZArith. (* + devient l'addition sur les entiers relatifs mais
                     l'addition sur N reste accessible par Arith.+ *)

  Contraintes : 

  - les expressions style Arith.+ doivent être reconnues par
  l'analyseur lexicale (sinon la grammaire n'est plus LL1). Pour
  garder le "." dans le pour tout, on pourrait adopter ce principe: un
  "." immédiatement suivi d'une lettre doit être compris comme un
  accès qualifié et le "." se différencie par le fait qu'il serait
  suivi d'un blanc, ce qui est conforme à la typographie usuelle.

  cf aussi E

  D2) Chaque module exporte 2 notations, "+" et une autre (typiquement
  "+_N" pour les naturels, "+_Z" pour les entiers relatifs, ...).
  Le dernier module "ouvert" impose son "+" mais les autres restent
  accessibles par le symbole indexé.

  Cette option requiert des symboles mixtes (cf H)

  D3) ...

  Remarque supplémentaire sur les constantes numériques: si on ne
  choisit pas l'option D1 (qualification style N.1), on doit pouvoir les
  mettre dans "positive" par défaut et jouer avec les coercions pour
  qu'elles atterissent dans le type attendu (N, Z, ...).


E) Constructeurs de type de données

  Propositions: utilisation de ** pour prod et ++ pour sum, rien pour
sumor et sumbool (qui pourrait être renommé "dec" ou "decidable").

  Quid de sig ?


F) Egalité et existentielle

  Consensus pour fusionner = et ==, càd que = dénote eqT (càd l'actuel ==)
et que la notation == disparaisse. La cumulativité assure la compatibilité.

  Mieux, idée à explorer que = dénote l'égalité de John Major. Tenants
et aboutissants ???

  Consensus pour avoir une existentielle unique (donc au niveau type
en jouant sur la cumulativité). La notation serait naturellement
"? x. P x", "exists x. P x" ou "Exists x. P x".


G) Autres connecteurs

  Les choix actuels semblent convenir... (->, /\, \/ et ~) 


H) Extensibilité de la syntaxe (tokens)

  H1) Une famille de token non extensible limitée à l'avance,
  typiquement constituée des suites de symboles spéciaux (comme en Caml)

  Avantage : le lexeur peut être "camllex" (est-ce important ?)

  Inconvénients :
    - Comment gérer les tokens style "=_S" (cf D2)
      Dans l'option qualification des symboles (cf D1), cela pourrait 
      être "S.=", sinon... any ideas ?
    - Obligation de séparer, comme dans ~~A, etc

  Rem: Les tokens composés uniquement de lettres, tel que "U" pour
  l'union pourrait être autorisés à condition de les quoter par des « '
  », « ` » ou « " », ce qui d'ailleurs améliore leur lisibilité.

  H2) Famille de token extensible (comme en V6)
  
  Avantage : grande souplesse de choix de nouveaux symboles ce que
l'usage mathématique apprécie


J) Extensibilité de la syntaxe (règles)

  Consensus apparent pour limiter l'usage de Grammar et Syntax. Comme
de toutes façons se sont essentiellement des infixes, ainsi que quelques
préfixes, postfixes et distfixes dont on a besoin !

  Prendre soin des combinaisons précédence/associativité pour les
symboles à la fois préfixe/postfixe et infixe comme le "-".


K) Variables existentielles

  Si "?" est pris pour l'existentielle, "_", "_1", ... pourrait convenir.


L) Arguments implicites

  L1) Proposition (HH) d'unifier la notation "1!a" des arguments
implicites avec celle du "with" de Apply, et celle de "Intros Until",
sous une forme "f a b c with x:=d, 2:=H".

  Les index désigneraient alors les arguments non nommés (qu'ils
soient implicites ou non).

  L2) Si "!" est pris pour le produit, "1!c" pourrait devenir "@1:=c"
  ou quelque chose comme cela.


M) Point fixe

  Quelques idées... sachant que le cas est rare et que l'effort doit
porter d'abord sur Fixpoint.

  M1) "(let f a (b:B) c = ... and g d e f : A = ... in f) u v"
  M2) "(fun f a (b:B) c = ... and {h} x y = ... and g d e f = ...) u v"
    (ici, accolades pour dire que c'est h qui est projeté)
  M3) "(fix f where f a (b:B) c := ... and ... g d e f : A = ...) u v"

  + détection automatique des arguments gardés et mention optionnelle
  du type résultat.


N) Filtrage

  N1) sans contrainte :

      "match t with p1 => t1 | ... | pn => tn end" 

  et pas de parenthèses autour des pattern si pas autour de l'application

  N2) avec contrainte :

      "match t as x : I p1 .. pn y1 .. yq => T with
         p1 => t1
       | ...
       | pn => tn
       end" 

  N3) multiple

      "match t1, .., tq with
         p11, .., p1q => t1
       | .. 
       | pn1, .., pnq => tn
       end" 

  Problème avec le choix de la virgule : conflit avec la notation
  primitive des n-uplets si ceux-ci ne sont pas entourées par des
  parenthèses.

  Alternative : séparation avec un "&" (pas d'ambiguïté avec les
  paires) mais réquisitionne le symbole, et pas très standard (sauf
  latex...), quoique le symbole est intuitif.

  N4) multiple avec contrainte

      "match t1 as x : I p1 .. pn y1 .. yq, .., tq as ... => T with
         p11, .., p1q => t1
       | .. 
       | pn1, .., pnq => tn
       end"  

  Alternatives: case, cases, ...


II) Gallina

A) Terminateur de phrase

  Le "." étant apprécié pour le pour tout, il conviendrait d'en
changer (pour la qualification on peut vivre avec en suivant le
principe mentionné en I-D1).

  A1) ";;"

  Deux symboles donc peu d'interférence avec le reste, cohérence avec
  caml, mais assez lourd
 
  A2) ";" 

  Léger, comme en SML, mais oblige à changer la syntaxe du THEN
  (alternatives "," ou "THEN"), des records (alternative ",") et
  interdit dans le ";" dans les lieurs (I-A3a3 et I-A3b3).

B) Records

C) Point fixe (cf I-M)

  C1) "Fixpoint f a (b:B) c := ... and g d e f : A := ... ."
  C2) "Fixpoint f a (b:B) c := ... with g d e f : A := ... ."



III) Tactiques

Questions ouvertes :

- Incompatibilité de prendre en compte dans ltad des arguments
  numériques en conflit avec des ident, comme dans "Unfold 1 3 plus".

  Suggestion : "Unfold [1 3] plus".

- La syntaxe "Pattern -2 -1 x" est-elle claire ? Le "-" voulant dire
  sauf et non en partant de la fin.

  Suggestion de CP : on réécrit le but avec des _ à la place des occurrences
  souhaitées.

IV) Vernac

Mots-cles Variables/Hypotheses/Parameters ? Si oui, pourquoi pas Axioms ?

Intégrer Eval In à Constr ? Oui, mais avec une syntax plus légère
Ou alors standardiser
Definition_kind id params := red_expr c : t.

Intégrer "with_binding" à Constr !

Faut-il séparer command/gallina/gallina_ext/syntax, sachant que si
l'on sépare, alors il ne faut plus partager de premier mot-clé (ex:
Add et Print seront réservé pour command) ?

Virer theorem_body_line ?

Virer le Mutual old syntax ! Et même implanter le future style de
Christine avec paramètres engendrés automatiquement et propre à chaque inductif

Scheme est-il Gallina ou pas ?
Require est-il gallina_ext ou commande ? Et faut-il garder specif ?
Utilite de RequireFrom ?

Faire des qualid un token ?

EVAL et CONTEXT dans constr: partout ou seulement en tete ?
Supprimer Specialize, supprimer with c (sans nom)

Ltac impose que "?" soit utilisable là où un identificateur ou un nom
long est attendu (p.ex. dans Clear). Accepte-t-on le principe ?

V) Bibliothèque standard

Zcompare_EGAL -> Zcompare_EQUAL