aboutsummaryrefslogtreecommitdiffhomepage
path: root/theories/Reals/Rsyntax.v
blob: 8e07739c3b9e3712743dbffc71fb4afe1e9141d6 (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
(* $Id$ *)

Require Export Rdefinitions.

Axiom NRplus : R->R->R.

Grammar rnatural ident :=
  nat_id [ prim:var($id) ] -> [$id]

with rnegnumber := 
  neg_expr [ "-" rnumber ($c) ] -> [<<(Ropp $c)>>] 

with rnumber :=

with rformula :=
  form_expr [ rexpr($p) ] -> [$p]
| form_eq [ rexpr($p) "==" rexpr($c) ] -> [<<(eqT R $p $c)>>]
| form_le [ rexpr($p) "<=" rexpr($c) ] -> [<<(Rle $p $c)>>]
| form_lt [ rexpr($p) "<" rexpr($c) ] -> [<<(Rlt $p $c)>>]
| form_ge [ rexpr($p) ">=" rexpr($c) ] -> [<<(Rge $p $c)>>]
| form_gt [ rexpr($p) ">" rexpr($c) ] -> [<<(Rgt $p $c)>>]
| form_eq_eq [ rexpr($p) "==" rexpr($c) "==" rexpr($c1) ]
              -> [<<(eqT R $p $c)/\(eqT R $c $c1)>>]
| form_le_le [ rexpr($p) "<=" rexpr($c) "<=" rexpr($c1) ]
              -> [<<(Rle $p $c)/\(Rle $c $c1)>>]
| form_le_lt [ rexpr($p) "<=" rexpr($c) "<" rexpr($c1) ]
              -> [<<(Rle $p $c)/\(Rlt $c $c1)>>]
| form_lt_le [ rexpr($p) "<" rexpr($c) "<=" rexpr($c1) ]
              -> [<<(Rlt $p $c)/\(Rle $c $c1)>>]
| form_lt_lt [ rexpr($p) "<" rexpr($c) "<" rexpr($c1) ]
              -> [<<(Rlt $p $c)/\(Rlt $c $c1)>>]
| form_neq  [ rexpr($p) "<>" rexpr($c) ] -> [<< ~(eqT R $p $c)>>]

with rexpr :=
  expr_plus [ rexpr($p) "+" rexpr($c) ] -> [<<(Rplus $p $c)>>]
| expr_minus [ rexpr($p) "-" rexpr($c) ] -> [<<(Rminus $p $c)>>]
| rexpr2 [ rexpr2($e) ] -> [$e]

with rexpr2 :=
  expr_mult [ rexpr2($p) "*" rexpr2($c) ] -> [<<(Rmult $p $c)>>]
| rexpr0 [ rexpr0($e) ] -> [$e]


with rexpr0 :=
  expr_id [ constr:global($c) ] -> [$c]
| expr_com [ "[" constr:constr($c) "]" ] -> [$c]
| expr_appl [ "(" rapplication($a) ")" ] -> [$a]
| expr_num [ rnumber($s) ] -> [$s ]
| expr_negnum [ "-" rnegnumber($n) ] -> [ $n ]
| expr_div [ rexpr0($p) "/" rexpr0($c) ] -> [<<(Rdiv $p $c)>>]
| expr_opp [ "-" rexpr0($c) ] -> [<<(Ropp $c)>>] 
| expr_inv [ "1" "/" rexpr0($c) ] -> [<<(Rinv $c)>>]

with rapplication :=
  apply [ rapplication($p) rexpr($c1) ] -> [<<($p $c1)>>]
| pair [ rexpr($p) "," rexpr($c) ] -> [<<($p, $c)>>]
| appl0 [ rexpr($a) ] -> [$a].


Grammar command command0 :=
  r_in_com [ "``" rnatural:rformula($c) "``" ] -> [$c].

Grammar command atomic_pattern :=
  r_in_pattern [ "``" rnatural:rnumber($c) "``" ] -> [$c].   

(** pp **)
(* pb: on rajoute des () lorsque les constantes terminent par 1 lors de
l'appel avec NRplus *)



Syntax constr
  level 0:
   Rle [ (Rle $n1 $n2) ] -> 
      [[<hov 0> "``" (REXPR $n1) [1 0] "<= " (REXPR $n2) "``"]]
  | Rlt [ (Rlt $n1 $n2) ] -> 
      [[<hov 0> "``" (REXPR $n1) [1 0] "< "(REXPR $n2) "``" ]]
  | Rge [ (Rge $n1 $n2) ] -> 
      [[<hov 0> "``" (REXPR $n1) [1 0] ">= "(REXPR $n2) "``" ]]
  | Rgt [ (Rgt $n1 $n2) ] -> 
      [[<hov 0> "``" (REXPR $n1) [1 0] "> "(REXPR $n2) "``" ]]
  | Req [ (eqT R $n1 $n2) ] -> 
      [[<hov 0> "``" (REXPR $n1) [1 0] "== "(REXPR $n2)"``"]]
  | Rneq [ ~(eqT R $n1 $n2) ] ->
      [[<hov 0> "``" (REXPR $n1) [1 0] "<> "(REXPR $n2) "``"]]
  | Rle_Rle [ (Rle $n1 $n2)/\(Rle $n2 $n3) ] ->
      [[<hov 0> "``" (REXPR $n1) [1 0] "<= " (REXPR $n2)
                                [1 0] "<= " (REXPR $n3) "``"]]
  | Rle_Rlt [ (Rle $n1 $n2)/\(Rlt $n2 $n3) ] ->
      [[<hov 0> "``" (REXPR $n1) [1 0] "<= "(REXPR $n2)
                                [1 0] "< " (REXPR $n3) "``"]]
  | Rlt_Rle [ (Rlt $n1 $n2)/\(Rle $n2 $n3) ] ->
      [[<hov 0> "``" (REXPR $n1) [1 0] "< " (REXPR $n2)
                                [1 0] "<= " (REXPR $n3) "``"]]
  | Rlt_Rlt [ (Rlt $n1 $n2)/\(Rlt $n2 $n3) ] ->
      [[<hov 0> "``" (REXPR $n1) [1 0] "< " (REXPR $n2)
                                [1 0] "< " (REXPR $n3) "``"]]
  | Rzero [ R0 ] -> ["``0``"]
  | Rone [ R1 ] -> ["``1``"]
  | Rconst [(Rplus $r R1)] -> [$r:"r_printer"]
  ;

  level 7:
    Rplus [ (Rplus $n1 $n2) ]
      -> [ [<hov 0> "``"(REXPR $n1):E "+"  [0 0] (REXPR $n2):L "``"] ]
   | Rminus [ (Rminus $n1 $n2) ]
      -> [ [<hov 0> "``"(REXPR $n1):E "-" [0 0] (REXPR $n2):L "``"] ]
  ;

  level 6:
    Rmult [ (Rmult $n1 $n2) ]
      -> [ [<hov 0> "``"(REXPR $n1):E "*" [0 0] (REXPR $n2):L "``"] ]
    |Rdiv [ (Rdiv $n1 $n2) ]
      -> [ [<hov 0> "``"(REXPR $n1):E "/" [0 0] (REXPR $n2):L "``"] ]
  ;

  level 8:
    Ropp [(Ropp $n1)] -> [ [<hov 0> "``" "-"(REXPR $n1):E "``"] ]
    |Rinv [(Rinv $n1)] -> [ [<hov 0> "``" "1""/"(REXPR $n1):E "``"] ]
  ;

  level 0:
    rescape_inside [<< (REXPR $r) >>] -> [ "[" $r:E "]" ]
  ;

  level 4:
    Rappl_inside [<<(REXPR (APPLIST $h ($LIST $t)))>>]
 -> [ [<hov 0> "("(REXPR $h):E [1 0] (APPLINSIDETAIL ($LIST $t)):E ")"] ]
  | Rappl_inside_tail [<<(APPLINSIDETAIL $h ($LIST $t))>>]
      -> [(REXPR $h):E [1 0] (APPLINSIDETAIL ($LIST $t)):E] 
  | Rappl_inside_one [<<(APPLINSIDETAIL $e)>>] ->[(REXPR $e):E]
  | rpair_inside [<<(REXPR <<(pair $s1 $s2 $r1 $r2)>>)>>] 
      -> [ [<hov 0> "("(REXPR $r1):E "," [1 0] (REXPR $r2):E ")"] ]
  ;

 level 3:
    rvar_inside [<<(REXPR ($VAR $i))>>] -> [$i]
  | rconst_inside [<<(REXPR (CONST $c))>>] -> [(CONST $c)]
  | rmutind_inside [<<(REXPR (MUTIND $i $n))>>] 
      -> [(MUTIND $i $n)]
  | rmutconstruct_inside [<<(REXPR (MUTCONSTRUCT $c1 $c2 $c3))>>]
      -> [ (MUTCONSTRUCT $c1 $c2 $c3) ]
  | rimplicit_head_inside [<<(REXPR (XTRA "!" $c))>>] -> [ $c ]
  | rimplicit_arg_inside  [<<(REXPR (XTRA "!" $n $c))>>] -> [ ]

  ;

  
  level 7:
   Rplus_inside
      [<<(REXPR <<(Rplus $n1 $n2)>>)>>]
      	 -> [ (REXPR $n1):E "+" [0 0] (REXPR $n2):L ]
  | Rminus_inside
      [<<(REXPR <<(Rminus $n1 $n2)>>)>>]
      	 -> [ (REXPR $n1):E "-" [0 0] (REXPR $n2):L ]
  | NRplus_inside
      [<<(REXPR <<(NRplus $n1 $n2)>>)>>]
      	 -> ["(" (REXPR $n1):E "+" [0 0] (REXPR $n2):L ")"]
  ;

  level 6:
    Rmult_inside
      [<<(REXPR <<(Rmult $n1 $n2)>>)>>]
      	 -> [ (REXPR $n1):E "*" [0 0] (REXPR $n2):L ]
    |Rdiv_inside
      [<<(REXPR <<(Rdiv $n1 $n2)>>)>>]
      	 -> [ (REXPR $n1):E "/" [0 0] (REXPR $n2):L ]
  ;

  level 6:
 Ropp_inside [<<(REXPR <<(Ropp $n1)>>)>>] -> [ "-" (REXPR $n1):E  ]
|Rinv_inside [<<(REXPR <<(Rinv $n1)>>)>>] -> [ "1""/" (REXPR $n1):E  ]
  ;  

  level 0:
    Rzero_inside [<<(REXPR <<R0>>)>>] -> ["0"]
  | Rone_inside [<<(REXPR <<R1>>)>>] -> ["1"]
  | Rconst_inside [<<(REXPR <<(Rplus $r R1)>>)>>] -> [$r:"r_printer"].