@@ -46,8 +46,41 @@ pred close o:list term.
46
46
close [] :- !.
47
47
close [_|XS] :- close XS.
48
48
49
+ % [field-mode] is true if the target is a field equation.
49
50
pred field-mode.
50
51
52
+ pred quote.expr.variable i:term, o:term.
53
+ quote.expr.variable In {{ @FEX Z lp:In }} :- field-mode, !.
54
+ quote.expr.variable In {{ @PEX Z lp:In }} :- !.
55
+
56
+ pred quote.expr.constant i:term, o:term.
57
+ quote.expr.constant In {{ @FEc Z lp:In }} :- field-mode, !.
58
+ quote.expr.constant In {{ @PEc Z lp:In }} :- !.
59
+
60
+ pred quote.expr.zero o:term.
61
+ quote.expr.zero {{ @FEO Z }} :- field-mode, !.
62
+ quote.expr.zero {{ @PEO Z }} :- !.
63
+
64
+ pred quote.expr.opp i:term, o:term.
65
+ quote.expr.opp In {{ @FEopp Z lp:In }} :- field-mode, !.
66
+ quote.expr.opp In {{ @PEopp Z lp:In }} :- !.
67
+
68
+ pred quote.expr.add i:term, i:term, o:term.
69
+ quote.expr.add In1 In2 {{ @FEadd Z lp:In1 lp:In2 }} :- field-mode, !.
70
+ quote.expr.add In1 In2 {{ @PEadd Z lp:In1 lp:In2 }} :- !.
71
+
72
+ pred quote.expr.one o:term.
73
+ quote.expr.one {{ @FEI Z }} :- field-mode, !.
74
+ quote.expr.one {{ @PEI Z }} :- !.
75
+
76
+ pred quote.expr.mul i:term, i:term, o:term.
77
+ quote.expr.mul In1 In2 {{ @FEmul Z lp:In1 lp:In2 }} :- field-mode, !.
78
+ quote.expr.mul In1 In2 {{ @PEmul Z lp:In1 lp:In2 }} :- !.
79
+
80
+ pred quote.expr.exp i:term, i:term, o:term.
81
+ quote.expr.exp In1 In2 {{ @FEpow Z lp:In1 lp:In2 }} :- field-mode, !.
82
+ quote.expr.exp In1 In2 {{ @PEpow Z lp:In1 lp:In2 }} :- !.
83
+
51
84
% [ring->field Ring Field]: [Field] is optionally a [fieldType] instance such
52
85
% that [GRing.Field.ringType Field = Ring].
53
86
pred ring->field i:term, o:option term.
@@ -67,7 +100,7 @@ ring->field _ none.
67
100
pred quote.nat1 i:term, i:term, o:term, o:term, o:list term.
68
101
quote.nat1 _ In {{ @NatX lp:In }} Out _ :-
69
102
% TODO: more efficient constant detection
70
- if field-mode ( Out = {{ @FEc Z lp:Out' }}) ( Out = {{ @PEc Z lp:Out' }}) ,
103
+ quote.expr.constant Out' Out,
71
104
nat-constant N { coq.reduction.vm.norm In {{ nat }} }, !,
72
105
z-constant N Out'.
73
106
quote.nat1 Ring In OutM Out VarMap :- !,
@@ -76,8 +109,7 @@ quote.nat1 Ring In OutM Out VarMap :- !,
76
109
pred quote.nat2 i:term, i:term, o:term, o:term, o:list term.
77
110
quote.nat2 Ring {{ addn lp:In1 lp:In2 }}
78
111
{{ @NatAdd lp:OutM1 lp:OutM2 }} Out VarMap :- !,
79
- if field-mode (Out = {{ @FEadd Z lp:Out1 lp:Out2 }})
80
- (Out = {{ @PEadd Z lp:Out1 lp:Out2 }}), !,
112
+ quote.expr.add Out1 Out2 Out, !,
81
113
quote.nat1 Ring In1 OutM1 Out1 VarMap, !,
82
114
quote.nat1 Ring In2 OutM2 Out2 VarMap.
83
115
quote.nat2 Ring {{ S lp:In1 }} {{ NatSucc lp:OutM1 }} Out VarMap :- !,
@@ -86,23 +118,20 @@ quote.nat2 Ring {{ S lp:In1 }} {{ NatSucc lp:OutM1 }} Out VarMap :- !,
86
118
quote.nat2 Ring In1 OutM1 Out1 VarMap.
87
119
quote.nat2 Ring {{ muln lp:In1 lp:In2 }}
88
120
{{ NatMul lp:OutM1 lp:OutM2 }} Out VarMap :- !,
89
- if field-mode (Out = {{ @FEmul Z lp:Out1 lp:Out2 }})
90
- (Out = {{ @PEmul Z lp:Out1 lp:Out2 }}), !,
121
+ quote.expr.mul Out1 Out2 Out, !,
91
122
quote.nat1 Ring In1 OutM1 Out1 VarMap, !,
92
123
quote.nat1 Ring In2 OutM2 Out2 VarMap.
93
124
quote.nat2 Ring {{ expn lp:In1 lp:In2 }}
94
125
{{ NatExp lp:OutM1 lp:In2 }} Out VarMap :-
95
- if field-mode (Out = {{ @FEpow Z lp:Out1 lp:Out2 }})
96
- (Out = {{ @PEpow Z lp:Out1 lp:Out2 }}),
126
+ quote.expr.exp Out1 Out2 Out, !,
97
127
nat-constant Exp { coq.reduction.vm.norm In2 {{ nat }} },
98
128
!,
99
129
quote.nat2 Ring In1 OutM1 Out1 VarMap, !,
100
130
n-constant Exp Out2.
101
131
quote.nat2 Ring In {{ NatX lp:In }} Out VarMap :-
102
- if field-mode (Out = {{ @FEX Z lp:Out' }}) (Out = {{ @PEX Z lp:Out' }}),
103
132
Zmodule = {{ GRing.Ring.zmodType lp:Ring }},
104
133
mem VarMap {{ @GRing.natmul lp:Zmodule (@GRing.one lp:Ring) lp:In }} N,
105
- positive-constant {calc (N + 1)} Out' ,
134
+ quote.expr.variable { positive-constant {calc (N + 1)} } Out,
106
135
!.
107
136
108
137
% [quote.zmod SrcZmodule TgtRing MorphFun Morph Input OutM Out VarMap]
@@ -118,15 +147,15 @@ pred quote.zmod i:term, i:term, i:(term -> term), i:term, i:term,
118
147
% 0%R
119
148
quote.zmod SrcZmodule _ _ _ {{ @GRing.zero lp:SrcZmodule' }}
120
149
{{ @Zmod0 lp:SrcZmodule }} Out _ :-
121
- if field-mode ( Out = {{ @FEO Z }}) (Out = {{ @PEO Z }}) ,
150
+ quote.expr.zero Out,
122
151
coq.unify-eq {{ @GRing.zero lp:SrcZmodule }}
123
152
{{ @GRing.zero lp:SrcZmodule' }} ok,
124
153
!.
125
154
% -%R
126
155
quote.zmod SrcZmodule TgtRing MorphFun Morph
127
156
{{ @GRing.opp lp:SrcZmodule' lp:In1 }}
128
157
{{ @ZmodOpp lp:SrcZmodule lp:OutM1 }} Out VarMap :-
129
- if field-mode (Out = {{ @FEopp Z lp: Out1 }}) ( Out = {{ @PEopp Z lp:Out1 }}) ,
158
+ quote.expr.opp Out1 Out,
130
159
coq.unify-eq {{ @GRing.opp lp:SrcZmodule }}
131
160
{{ @GRing.opp lp:SrcZmodule' }} ok,
132
161
!,
@@ -135,8 +164,7 @@ quote.zmod SrcZmodule TgtRing MorphFun Morph
135
164
quote.zmod SrcZmodule TgtRing MorphFun Morph
136
165
{{ @GRing.add lp:SrcZmodule' lp:In1 lp:In2 }}
137
166
{{ @ZmodAdd lp:SrcZmodule lp:OutM1 lp:OutM2 }} Out VarMap :-
138
- if field-mode (Out = {{ @FEadd Z lp:Out1 lp:Out2 }})
139
- (Out = {{ @PEadd Z lp:Out1 lp:Out2 }}),
167
+ quote.expr.add Out1 Out2 Out,
140
168
coq.unify-eq {{ @GRing.add lp:SrcZmodule }}
141
169
{{ @GRing.add lp:SrcZmodule' }} ok,
142
170
!,
@@ -146,8 +174,7 @@ quote.zmod SrcZmodule TgtRing MorphFun Morph
146
174
quote.zmod SrcZmodule TgtRing MorphFun Morph
147
175
{{ @GRing.natmul lp:SrcZmodule' lp:In1 lp:In2 }}
148
176
{{ @ZmodMuln lp:SrcZmodule lp:OutM1 lp:OutM2 }} Out VarMap :-
149
- if field-mode (Out = {{ @FEmul Z lp:Out1 lp:Out2 }})
150
- (Out = {{ @PEmul Z lp:Out1 lp:Out2 }}),
177
+ quote.expr.mul Out1 Out2 Out,
151
178
coq.unify-eq SrcZmodule SrcZmodule' ok,
152
179
!,
153
180
quote.zmod SrcZmodule TgtRing MorphFun Morph In1 OutM1 Out1 VarMap, !,
@@ -156,8 +183,7 @@ quote.zmod SrcZmodule TgtRing MorphFun Morph
156
183
quote.zmod SrcZmodule TgtRing MorphFun Morph
157
184
{{ @intmul lp:SrcZmodule' lp:In1 lp:In2 }}
158
185
{{ @ZmodMulz lp:SrcZmodule lp:OutM1 lp:OutM2 }} Out VarMap :-
159
- if field-mode (Out = {{ @FEmul Z lp:Out1 lp:Out2 }})
160
- (Out = {{ @PEmul Z lp:Out1 lp:Out2 }}),
186
+ quote.expr.mul Out1 Out2 Out,
161
187
coq.unify-eq SrcZmodule SrcZmodule' ok,
162
188
TgtZmodule = {{ GRing.Ring.zmodType lp:TgtRing }},
163
189
!,
@@ -183,9 +209,8 @@ quote.zmod SrcZmodule TgtRing MorphFun Morph In
183
209
% variables
184
210
quote.zmod SrcZmodule _ MorphFun _ In
185
211
{{ @ZmodX lp:SrcZmodule lp:In }} Out VarMap :-
186
- if field-mode (Out = {{ @FEX Z lp:Pos }}) (Out = {{ @PEX Z lp:Pos }}),
187
212
mem VarMap (MorphFun In) N,
188
- positive-constant {calc (N + 1)} Pos ,
213
+ quote.expr.variable { positive-constant {calc (N + 1)} } Out ,
189
214
!.
190
215
quote.zmod _ _ _ _ In _ _ _ :- coq.error "Unknown" {coq.term->string In}.
191
216
@@ -203,15 +228,15 @@ pred quote.ring i:term, i:option term, i:term, i:(term -> term), i:term,
203
228
% 0%R
204
229
quote.ring SrcRing _ _ _ _ {{ @GRing.zero lp:SrcZmodule }}
205
230
{{ @Ring0 lp:SrcRing }} Out _ :-
206
- if field-mode ( Out = {{ @FEO Z }}) (Out = {{ @PEO Z }}) ,
231
+ quote.expr.zero Out,
207
232
coq.unify-eq {{ @GRing.zero lp:SrcZmodule }}
208
233
{{ @GRing.zero (GRing.Ring.zmodType lp:SrcRing) }} ok,
209
234
!.
210
235
% -%R
211
236
quote.ring SrcRing SrcField TgtRing MorphFun Morph
212
237
{{ @GRing.opp lp:SrcZmodule lp:In1 }}
213
238
{{ @RingOpp lp:SrcRing lp:OutM1 }} Out VarMap :-
214
- if field-mode (Out = {{ @FEopp Z lp: Out1 }}) ( Out = {{ @PEopp Z lp:Out1 }}) ,
239
+ quote.expr.opp Out1 Out,
215
240
coq.unify-eq {{ @GRing.opp lp:SrcZmodule }}
216
241
{{ @GRing.opp (GRing.Ring.zmodType lp:SrcRing) }} ok,
217
242
!,
@@ -220,8 +245,7 @@ quote.ring SrcRing SrcField TgtRing MorphFun Morph
220
245
quote.ring SrcRing SrcField TgtRing MorphFun Morph
221
246
{{ @GRing.add lp:SrcZmodule lp:In1 lp:In2 }}
222
247
{{ @RingAdd lp:SrcRing lp:OutM1 lp:OutM2 }} Out VarMap :-
223
- if field-mode (Out = {{ @FEadd Z lp:Out1 lp:Out2 }})
224
- (Out = {{ @PEadd Z lp:Out1 lp:Out2 }}),
248
+ quote.expr.add Out1 Out2 Out,
225
249
coq.unify-eq {{ @GRing.add lp:SrcZmodule }}
226
250
{{ @GRing.add (GRing.Ring.zmodType lp:SrcRing) }} ok,
227
251
!,
@@ -231,8 +255,7 @@ quote.ring SrcRing SrcField TgtRing MorphFun Morph
231
255
quote.ring SrcRing SrcField TgtRing MorphFun Morph
232
256
{{ @GRing.natmul lp:SrcZmodule lp:In1 lp:In2 }}
233
257
{{ @RingMuln lp:SrcRing lp:OutM1 lp:OutM2 }} Out VarMap :-
234
- if field-mode (Out = {{ @FEmul Z lp:Out1 lp:Out2 }})
235
- (Out = {{ @PEmul Z lp:Out1 lp:Out2 }}),
258
+ quote.expr.mul Out1 Out2 Out,
236
259
coq.unify-eq SrcZmodule {{ @GRing.Ring.zmodType lp:SrcRing }} ok,
237
260
!,
238
261
quote.ring SrcRing SrcField TgtRing MorphFun Morph In1 OutM1 Out1 VarMap, !,
@@ -241,8 +264,7 @@ quote.ring SrcRing SrcField TgtRing MorphFun Morph
241
264
quote.ring SrcRing SrcField TgtRing MorphFun Morph
242
265
{{ @intmul lp:SrcZmodule lp:In1 lp:In2 }}
243
266
{{ @RingMulz lp:SrcRing lp:OutM1 lp:OutM2 }} Out VarMap :-
244
- if field-mode (Out = {{ @FEmul Z lp:Out1 lp:Out2 }})
245
- (Out = {{ @PEmul Z lp:Out1 lp:Out2 }}),
267
+ quote.expr.mul Out1 Out2 Out,
246
268
coq.unify-eq SrcZmodule {{ @GRing.Ring.zmodType lp:SrcRing }} ok,
247
269
TgtZmodule = {{ GRing.Ring.zmodType lp:TgtRing }},
248
270
!,
@@ -254,15 +276,14 @@ quote.ring SrcRing SrcField TgtRing MorphFun Morph
254
276
% 1%R
255
277
quote.ring SrcRing _ _ _ _ {{ @GRing.one lp:SrcRing' }}
256
278
{{ @Ring1 lp:SrcRing }} Out _ :-
257
- if field-mode ( Out = {{ @FEI Z }}) (Out = {{ @PEI Z }}) ,
279
+ quote.expr.one Out,
258
280
coq.unify-eq {{ @GRing.one lp:SrcRing' }} {{ @GRing.one lp:SrcRing }} ok,
259
281
!.
260
282
% *%R
261
283
quote.ring SrcRing SrcField TgtRing MorphFun Morph
262
284
{{ @GRing.mul lp:SrcRing' lp:In1 lp:In2 }}
263
285
{{ @RingMul lp:SrcRing lp:OutM1 lp:OutM2 }} Out VarMap :-
264
- if field-mode (Out = {{ @FEmul Z lp:Out1 lp:Out2 }})
265
- (Out = {{ @PEmul Z lp:Out1 lp:Out2 }}),
286
+ quote.expr.mul Out1 Out2 Out,
266
287
coq.unify-eq {{ @GRing.mul lp:SrcRing' }} {{ @GRing.mul lp:SrcRing }} ok,
267
288
!,
268
289
quote.ring SrcRing SrcField TgtRing MorphFun Morph In1 OutM1 Out1 VarMap, !,
@@ -272,8 +293,7 @@ quote.ring SrcRing SrcField TgtRing MorphFun Morph
272
293
quote.ring SrcRing SrcField TgtRing MorphFun Morph
273
294
{{ @GRing.exp lp:SrcRing' lp:In1 lp:In2 }}
274
295
{{ @RingExpn lp:SrcRing lp:OutM1 lp:In2 }} Out VarMap :-
275
- if field-mode (Out = {{ @FEpow Z lp:Out1 lp:Out2 }})
276
- (Out = {{ @PEpow Z lp:Out1 lp:Out2 }}),
296
+ quote.expr.exp Out1 Out2 Out,
277
297
coq.unify-eq SrcRing' SrcRing ok,
278
298
nat-constant Exp { coq.reduction.vm.norm In2 {{ nat }} },
279
299
!,
@@ -283,8 +303,7 @@ quote.ring SrcRing SrcField TgtRing MorphFun Morph
283
303
quote.ring SrcRing SrcField TgtRing MorphFun Morph
284
304
{{ @exprz lp:SrcUnitRing lp:In1 lp:In2 }}
285
305
{{ @RingExpn lp:SrcRing lp:OutM1 lp:In2' }} Out VarMap :-
286
- if field-mode (Out = {{ @FEpow Z lp:Out1 lp:Out2 }})
287
- (Out = {{ @PEpow Z lp:Out1 lp:Out2 }}),
306
+ quote.expr.exp Out1 Out2 Out,
288
307
coq.unify-eq {{ GRing.UnitRing.ringType lp:SrcUnitRing }} SrcRing ok,
289
308
coq.unify-eq In2 {{ Posz lp:In2' }} ok,
290
309
nat-constant Exp { coq.reduction.vm.norm In2' {{ nat }} },
@@ -309,12 +328,11 @@ quote.ring SrcRing _ TgtRing _ _
309
328
quote.nat1 TgtRing In OutM Out VarMap.
310
329
% Negz
311
330
quote.ring SrcRing _ TgtRing _ _ {{ Negz lp:In }}
312
- {{ @RingNegz lp:OutM' }} Out VarMap :-
313
- if field-mode (Out = {{ @FEopp Z (@FEadd Z (@FEI Z) lp:Out') }})
314
- (Out = {{ @PEopp Z (@PEadd Z (@PEI Z) lp:Out') }}),
331
+ {{ @RingNegz lp:OutM1 }} Out VarMap :-
332
+ quote.expr.opp { quote.expr.add { quote.expr.one } Out1 } Out,
315
333
coq.unify-eq {{ int_Ring }} SrcRing ok,
316
334
!,
317
- quote.nat1 TgtRing In OutM' Out' VarMap.
335
+ quote.nat1 TgtRing In OutM1 Out1 VarMap.
318
336
% morphisms
319
337
quote.ring SrcRing _ TgtRing MorphFun Morph In
320
338
{{ @RingMorph lp:NewSrcRing lp:SrcRing lp:NewMorph lp:OutM }}
@@ -348,9 +366,8 @@ quote.ring SrcRing _ TgtRing MorphFun Morph In
348
366
(x\ MorphFun (NewMorphFun x)) CompMorph In1 OutM Out VarMap.
349
367
% variables
350
368
quote.ring SrcRing _ _ MorphFun _ In {{ @RingX lp:SrcRing lp:In }} Out VarMap :-
351
- if field-mode (Out = {{ @FEX Z lp:Pos }}) (Out = {{ @PEX Z lp:Pos }}),
352
369
mem VarMap (MorphFun In) N,
353
- positive-constant {calc (N + 1)} Pos ,
370
+ quote.expr.variable { positive-constant {calc (N + 1)} } Out ,
354
371
!.
355
372
quote.ring _ _ _ _ _ In _ _ _ :- coq.error "Unknown" {coq.term->string In}.
356
373
% TODO: converse ring
0 commit comments