Skip to content

Commit 900245a

Browse files
committed
Add quote.expr.* helper predicates for switching between ring/field modes
1 parent 28a1baa commit 900245a

File tree

1 file changed

+57
-40
lines changed

1 file changed

+57
-40
lines changed

theories/quote.elpi

Lines changed: 57 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,41 @@ pred close o:list term.
4646
close [] :- !.
4747
close [_|XS] :- close XS.
4848

49+
% [field-mode] is true if the target is a field equation.
4950
pred field-mode.
5051

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+
5184
% [ring->field Ring Field]: [Field] is optionally a [fieldType] instance such
5285
% that [GRing.Field.ringType Field = Ring].
5386
pred ring->field i:term, o:option term.
@@ -67,7 +100,7 @@ ring->field _ none.
67100
pred quote.nat1 i:term, i:term, o:term, o:term, o:list term.
68101
quote.nat1 _ In {{ @NatX lp:In }} Out _ :-
69102
% 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,
71104
nat-constant N { coq.reduction.vm.norm In {{ nat }} }, !,
72105
z-constant N Out'.
73106
quote.nat1 Ring In OutM Out VarMap :- !,
@@ -76,8 +109,7 @@ quote.nat1 Ring In OutM Out VarMap :- !,
76109
pred quote.nat2 i:term, i:term, o:term, o:term, o:list term.
77110
quote.nat2 Ring {{ addn lp:In1 lp:In2 }}
78111
{{ @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, !,
81113
quote.nat1 Ring In1 OutM1 Out1 VarMap, !,
82114
quote.nat1 Ring In2 OutM2 Out2 VarMap.
83115
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 :- !,
86118
quote.nat2 Ring In1 OutM1 Out1 VarMap.
87119
quote.nat2 Ring {{ muln lp:In1 lp:In2 }}
88120
{{ 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, !,
91122
quote.nat1 Ring In1 OutM1 Out1 VarMap, !,
92123
quote.nat1 Ring In2 OutM2 Out2 VarMap.
93124
quote.nat2 Ring {{ expn lp:In1 lp:In2 }}
94125
{{ 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, !,
97127
nat-constant Exp { coq.reduction.vm.norm In2 {{ nat }} },
98128
!,
99129
quote.nat2 Ring In1 OutM1 Out1 VarMap, !,
100130
n-constant Exp Out2.
101131
quote.nat2 Ring In {{ NatX lp:In }} Out VarMap :-
102-
if field-mode (Out = {{ @FEX Z lp:Out' }}) (Out = {{ @PEX Z lp:Out' }}),
103132
Zmodule = {{ GRing.Ring.zmodType lp:Ring }},
104133
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,
106135
!.
107136

108137
% [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,
118147
% 0%R
119148
quote.zmod SrcZmodule _ _ _ {{ @GRing.zero lp:SrcZmodule' }}
120149
{{ @Zmod0 lp:SrcZmodule }} Out _ :-
121-
if field-mode (Out = {{ @FEO Z }}) (Out = {{ @PEO Z }}),
150+
quote.expr.zero Out,
122151
coq.unify-eq {{ @GRing.zero lp:SrcZmodule }}
123152
{{ @GRing.zero lp:SrcZmodule' }} ok,
124153
!.
125154
% -%R
126155
quote.zmod SrcZmodule TgtRing MorphFun Morph
127156
{{ @GRing.opp lp:SrcZmodule' lp:In1 }}
128157
{{ @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,
130159
coq.unify-eq {{ @GRing.opp lp:SrcZmodule }}
131160
{{ @GRing.opp lp:SrcZmodule' }} ok,
132161
!,
@@ -135,8 +164,7 @@ quote.zmod SrcZmodule TgtRing MorphFun Morph
135164
quote.zmod SrcZmodule TgtRing MorphFun Morph
136165
{{ @GRing.add lp:SrcZmodule' lp:In1 lp:In2 }}
137166
{{ @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,
140168
coq.unify-eq {{ @GRing.add lp:SrcZmodule }}
141169
{{ @GRing.add lp:SrcZmodule' }} ok,
142170
!,
@@ -146,8 +174,7 @@ quote.zmod SrcZmodule TgtRing MorphFun Morph
146174
quote.zmod SrcZmodule TgtRing MorphFun Morph
147175
{{ @GRing.natmul lp:SrcZmodule' lp:In1 lp:In2 }}
148176
{{ @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,
151178
coq.unify-eq SrcZmodule SrcZmodule' ok,
152179
!,
153180
quote.zmod SrcZmodule TgtRing MorphFun Morph In1 OutM1 Out1 VarMap, !,
@@ -156,8 +183,7 @@ quote.zmod SrcZmodule TgtRing MorphFun Morph
156183
quote.zmod SrcZmodule TgtRing MorphFun Morph
157184
{{ @intmul lp:SrcZmodule' lp:In1 lp:In2 }}
158185
{{ @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,
161187
coq.unify-eq SrcZmodule SrcZmodule' ok,
162188
TgtZmodule = {{ GRing.Ring.zmodType lp:TgtRing }},
163189
!,
@@ -183,9 +209,8 @@ quote.zmod SrcZmodule TgtRing MorphFun Morph In
183209
% variables
184210
quote.zmod SrcZmodule _ MorphFun _ In
185211
{{ @ZmodX lp:SrcZmodule lp:In }} Out VarMap :-
186-
if field-mode (Out = {{ @FEX Z lp:Pos }}) (Out = {{ @PEX Z lp:Pos }}),
187212
mem VarMap (MorphFun In) N,
188-
positive-constant {calc (N + 1)} Pos,
213+
quote.expr.variable { positive-constant {calc (N + 1)} } Out,
189214
!.
190215
quote.zmod _ _ _ _ In _ _ _ :- coq.error "Unknown" {coq.term->string In}.
191216

@@ -203,15 +228,15 @@ pred quote.ring i:term, i:option term, i:term, i:(term -> term), i:term,
203228
% 0%R
204229
quote.ring SrcRing _ _ _ _ {{ @GRing.zero lp:SrcZmodule }}
205230
{{ @Ring0 lp:SrcRing }} Out _ :-
206-
if field-mode (Out = {{ @FEO Z }}) (Out = {{ @PEO Z }}),
231+
quote.expr.zero Out,
207232
coq.unify-eq {{ @GRing.zero lp:SrcZmodule }}
208233
{{ @GRing.zero (GRing.Ring.zmodType lp:SrcRing) }} ok,
209234
!.
210235
% -%R
211236
quote.ring SrcRing SrcField TgtRing MorphFun Morph
212237
{{ @GRing.opp lp:SrcZmodule lp:In1 }}
213238
{{ @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,
215240
coq.unify-eq {{ @GRing.opp lp:SrcZmodule }}
216241
{{ @GRing.opp (GRing.Ring.zmodType lp:SrcRing) }} ok,
217242
!,
@@ -220,8 +245,7 @@ quote.ring SrcRing SrcField TgtRing MorphFun Morph
220245
quote.ring SrcRing SrcField TgtRing MorphFun Morph
221246
{{ @GRing.add lp:SrcZmodule lp:In1 lp:In2 }}
222247
{{ @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,
225249
coq.unify-eq {{ @GRing.add lp:SrcZmodule }}
226250
{{ @GRing.add (GRing.Ring.zmodType lp:SrcRing) }} ok,
227251
!,
@@ -231,8 +255,7 @@ quote.ring SrcRing SrcField TgtRing MorphFun Morph
231255
quote.ring SrcRing SrcField TgtRing MorphFun Morph
232256
{{ @GRing.natmul lp:SrcZmodule lp:In1 lp:In2 }}
233257
{{ @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,
236259
coq.unify-eq SrcZmodule {{ @GRing.Ring.zmodType lp:SrcRing }} ok,
237260
!,
238261
quote.ring SrcRing SrcField TgtRing MorphFun Morph In1 OutM1 Out1 VarMap, !,
@@ -241,8 +264,7 @@ quote.ring SrcRing SrcField TgtRing MorphFun Morph
241264
quote.ring SrcRing SrcField TgtRing MorphFun Morph
242265
{{ @intmul lp:SrcZmodule lp:In1 lp:In2 }}
243266
{{ @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,
246268
coq.unify-eq SrcZmodule {{ @GRing.Ring.zmodType lp:SrcRing }} ok,
247269
TgtZmodule = {{ GRing.Ring.zmodType lp:TgtRing }},
248270
!,
@@ -254,15 +276,14 @@ quote.ring SrcRing SrcField TgtRing MorphFun Morph
254276
% 1%R
255277
quote.ring SrcRing _ _ _ _ {{ @GRing.one lp:SrcRing' }}
256278
{{ @Ring1 lp:SrcRing }} Out _ :-
257-
if field-mode (Out = {{ @FEI Z }}) (Out = {{ @PEI Z }}),
279+
quote.expr.one Out,
258280
coq.unify-eq {{ @GRing.one lp:SrcRing' }} {{ @GRing.one lp:SrcRing }} ok,
259281
!.
260282
% *%R
261283
quote.ring SrcRing SrcField TgtRing MorphFun Morph
262284
{{ @GRing.mul lp:SrcRing' lp:In1 lp:In2 }}
263285
{{ @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,
266287
coq.unify-eq {{ @GRing.mul lp:SrcRing' }} {{ @GRing.mul lp:SrcRing }} ok,
267288
!,
268289
quote.ring SrcRing SrcField TgtRing MorphFun Morph In1 OutM1 Out1 VarMap, !,
@@ -272,8 +293,7 @@ quote.ring SrcRing SrcField TgtRing MorphFun Morph
272293
quote.ring SrcRing SrcField TgtRing MorphFun Morph
273294
{{ @GRing.exp lp:SrcRing' lp:In1 lp:In2 }}
274295
{{ @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,
277297
coq.unify-eq SrcRing' SrcRing ok,
278298
nat-constant Exp { coq.reduction.vm.norm In2 {{ nat }} },
279299
!,
@@ -283,8 +303,7 @@ quote.ring SrcRing SrcField TgtRing MorphFun Morph
283303
quote.ring SrcRing SrcField TgtRing MorphFun Morph
284304
{{ @exprz lp:SrcUnitRing lp:In1 lp:In2 }}
285305
{{ @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,
288307
coq.unify-eq {{ GRing.UnitRing.ringType lp:SrcUnitRing }} SrcRing ok,
289308
coq.unify-eq In2 {{ Posz lp:In2' }} ok,
290309
nat-constant Exp { coq.reduction.vm.norm In2' {{ nat }} },
@@ -309,12 +328,11 @@ quote.ring SrcRing _ TgtRing _ _
309328
quote.nat1 TgtRing In OutM Out VarMap.
310329
% Negz
311330
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,
315333
coq.unify-eq {{ int_Ring }} SrcRing ok,
316334
!,
317-
quote.nat1 TgtRing In OutM' Out' VarMap.
335+
quote.nat1 TgtRing In OutM1 Out1 VarMap.
318336
% morphisms
319337
quote.ring SrcRing _ TgtRing MorphFun Morph In
320338
{{ @RingMorph lp:NewSrcRing lp:SrcRing lp:NewMorph lp:OutM }}
@@ -348,9 +366,8 @@ quote.ring SrcRing _ TgtRing MorphFun Morph In
348366
(x\ MorphFun (NewMorphFun x)) CompMorph In1 OutM Out VarMap.
349367
% variables
350368
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 }}),
352369
mem VarMap (MorphFun In) N,
353-
positive-constant {calc (N + 1)} Pos,
370+
quote.expr.variable { positive-constant {calc (N + 1)} } Out,
354371
!.
355372
quote.ring _ _ _ _ _ In _ _ _ :- coq.error "Unknown" {coq.term->string In}.
356373
% TODO: converse ring

0 commit comments

Comments
 (0)