@@ -50,17 +50,20 @@ def isForbiddenParent (parent? : Option Expr) : Bool :=
5050 -/
5151 true
5252 else if let some parent := parent? then
53- (getType? parent |>.isSome)
54- ||
55- /-
56- **Note** : We currently ignore `•`. We may reconsider it in the future.
57- -/
58- match_expr parent with
59- | HSMul.hSMul _ _ _ _ _ _ => true
60- | Nat.cast _ _ _ => true
61- | NatCast.natCast _ _ _ => true
62- | Grind.IntModule.OfNatModule.toQ _ _ _ => true
63- | _ => false
53+ if parent.isEq then
54+ false
55+ else
56+ (getType? parent |>.isSome)
57+ ||
58+ /-
59+ **Note** : We currently ignore `•`. We may reconsider it in the future.
60+ -/
61+ match_expr parent with
62+ | HSMul.hSMul _ _ _ _ _ _ => true
63+ | Nat.cast _ _ _ => true
64+ | NatCast.natCast _ _ _ => true
65+ | Grind.IntModule.OfNatModule.toQ _ _ _ => true
66+ | _ => false
6467 else
6568 false
6669
@@ -173,6 +176,12 @@ def setStructId (e : Expr) : OrderM Unit := do
173176 exprToStructId := s.exprToStructId.insert { expr := e } structId
174177 }
175178
179+ def updateTermMap (e eNew h : Expr) : GoalM Unit := do
180+ modify' fun s => { s with
181+ termMap := s.termMap.insert { expr := e } (eNew, h)
182+ termMapInv := s.termMapInv.insert { expr := eNew } (e, h)
183+ }
184+
176185def mkNode (e : Expr) : OrderM NodeId := do
177186 if let some nodeId := (← getStruct).nodeMap.find? { expr := e } then
178187 return nodeId
@@ -192,7 +201,19 @@ def mkNode (e : Expr) : OrderM NodeId := do
192201 -/
193202 if (← alreadyInternalized e) then
194203 orderExt.markTerm e
204+ if let some e' ← getOriginal? e then
205+ orderExt.markTerm e'
195206 return nodeId
207+ where
208+ getOriginal? (e : Expr) : GoalM (Option Expr) := do
209+ if let some (e', _) := (← get').termMapInv.find? { expr := e } then
210+ return some e'
211+ let_expr NatCast.natCast _ _ a := e | return none
212+ if (← alreadyInternalized a) then
213+ updateTermMap a e (← mkEqRefl e)
214+ return some a
215+ else
216+ return none
196217
197218def internalizeCnstr (e : Expr) (kind : CnstrKind) (lhs rhs : Expr) : OrderM Unit := do
198219 let some c ← mkCnstr? e kind lhs rhs | return ()
@@ -267,6 +288,7 @@ def toOffsetTerm? (e : Expr) : OrderM (Option OffsetTermResult) := do
267288
268289def internalizeTerm (e : Expr) : OrderM Unit := do
269290 let some r ← toOffsetTerm? e | return ()
291+ if e == r.a && r.k == 0 then return ()
270292 let x ← mkNode e
271293 let y ← mkNode r.a
272294 let h₁ ← mkOrdRingPrefix ``Grind.Order.le_of_offset_eq_1_k
@@ -276,12 +298,6 @@ def internalizeTerm (e : Expr) : OrderM Unit := do
276298 let h₂ := mkApp4 h₂ e r.a (toExpr r.k) r.h
277299 addEdge y x { k := -r.k } h₂
278300
279- def updateTermMap (e eNew h : Expr) : GoalM Unit := do
280- modify' fun s => { s with
281- termMap := s.termMap.insert { expr := e } (eNew, h)
282- termMapInv := s.termMapInv.insert { expr := eNew } (e, h)
283- }
284-
285301open Arith.Cutsat in
286302def adaptNat (e : Expr) : GoalM Expr := do
287303 if let some (eNew, _) := (← get').termMap.find? { expr := e } then
@@ -317,7 +333,7 @@ def adapt (α : Expr) (e : Expr) : GoalM (Expr × Expr) := do
317333 else
318334 return (α, e)
319335
320- def alreadyInternalized (e : Expr) : OrderM Bool := do
336+ def alreadyInternalizedHere (e : Expr) : OrderM Bool := do
321337 let s ← getStruct
322338 return s.cnstrs.contains { expr := e } || s.nodeMap.contains { expr := e }
323339
@@ -327,7 +343,7 @@ public def internalize (e : Expr) (parent? : Option Expr) : GoalM Unit := do
327343 let (α, e) ← adapt α e
328344 if isForbiddenParent parent? then return ()
329345 if let some structId ← getStructId? α then OrderM.run structId do
330- if (← alreadyInternalized e) then return ()
346+ if (← alreadyInternalizedHere e) then return ()
331347 match_expr e with
332348 | LE.le _ _ lhs rhs => internalizeCnstr e .le lhs rhs
333349 | LT.lt _ _ lhs rhs => if (← hasLt) then internalizeCnstr e .lt lhs rhs
0 commit comments