Process when an new equation is added to a congruence closure #
Update the acTodo field of the state.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Read the todo field of the state.
Equations
- Mathlib.Tactic.CC.CCM.getTodo = do let __do_lift ← get pure __do_lift.todo
Instances For
Read the acTodo field of the state.
Equations
- Mathlib.Tactic.CC.CCM.getACTodo = do let __do_lift ← get pure __do_lift.acTodo
Instances For
Add a new entry to the end of the todo list.
See also pushEq, pushHEq and pushReflEq.
Equations
- Mathlib.Tactic.CC.CCM.pushTodo lhs rhs H heqProof = Mathlib.Tactic.CC.CCM.modifyTodo fun (todo : Array Mathlib.Tactic.CC.TodoEntry) => todo.push (lhs, rhs, H, heqProof)
Instances For
Add the equality proof H : lhs = rhs to the end of the todo list.
Equations
- Mathlib.Tactic.CC.CCM.pushEq lhs rhs H = Mathlib.Tactic.CC.CCM.pushTodo lhs rhs H false
Instances For
Add the heterogeneous equality proof H : HEq lhs rhs to the end of the todo list.
Equations
- Mathlib.Tactic.CC.CCM.pushHEq lhs rhs H = Mathlib.Tactic.CC.CCM.pushTodo lhs rhs H true
Instances For
Record the instance e and add it to the set of known defeq instances.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Return the CongruencesKey associated with an expression of the form f a.
Equations
- One or more equations did not get rendered due to their size.
- Mathlib.Tactic.CC.CCM.mkCongruencesKey e = failure
Instances For
Return the SymmCongruencesKey associated with the equality lhs = rhs.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Auxiliary function for comparing lhs₁ ~ rhs₁ and lhs₂ ~ rhs₂,
when ~ is symmetric/commutative.
It returns true (equal) for a ~ b b ~ a.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Given k₁ := (R₁ lhs₁ rhs₁, `R₁) and k₂ := (R₂ lhs₂ rhs₂, `R₂), return true if
R₁ lhs₁ rhs₁ is equivalent to R₂ lhs₂ rhs₂ modulo the symmetry of R₁ and R₂.
Equations
- One or more equations did not get rendered due to their size.
Instances For
If the congruence table (congruences field) has congruent expression to e, add the
equality to the todo list. If not, add e to the congruence table.
Equations
- One or more equations did not get rendered due to their size.
Instances For
If the symm congruence table (symmCongruences field) has congruent expression to e, add the
equality to the todo list. If not, add e to the symm congruence table.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Given subsingleton elements a and b which are not necessarily of the same type, if the
types of a and b are equivalent, add the (heterogeneous) equality proof between a and b to
the todo list.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Given the equivalent expressions oldRoot and newRoot the root of oldRoot is
newRoot, if oldRoot has root representative of subsingletons, try to push the equality proof
between their root representatives to the todo list, or update the root representative to
newRoot.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Remove fn and expressions whose type isn't def-eq to fn's type out from lambdas,
return the remaining lambdas applied to the reversed arguments.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Trace the state of AC module.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Insert or erase lhs to the occurrences of arguments of e on an equality in acR.
Equations
- One or more equations did not get rendered due to their size.
- Mathlib.Tactic.CC.CCM.insertEraseROccs (↑e_2) lhs inLHS isInsert = Mathlib.Tactic.CC.CCM.insertEraseROcc e_2 lhs inLHS isInsert
Instances For
Insert lhs to the occurrences of arguments of e on an equality in acR.
Equations
- Mathlib.Tactic.CC.CCM.insertROccs e lhs inLHS = Mathlib.Tactic.CC.CCM.insertEraseROccs e lhs inLHS true
Instances For
Erase lhs to the occurrences of arguments of e on an equality in acR.
Equations
- Mathlib.Tactic.CC.CCM.eraseROccs e lhs inLHS = Mathlib.Tactic.CC.CCM.insertEraseROccs e lhs inLHS false
Instances For
Insert lhs to the occurrences on an equality in acR corresponding to the equality
lhs := rhs.
Equations
- Mathlib.Tactic.CC.CCM.insertRBHSOccs lhs rhs = do Mathlib.Tactic.CC.CCM.insertROccs lhs lhs true Mathlib.Tactic.CC.CCM.insertROccs rhs lhs false
Instances For
Erase lhs to the occurrences on an equality in acR corresponding to the equality
lhs := rhs.
Equations
- Mathlib.Tactic.CC.CCM.eraseRBHSOccs lhs rhs = do Mathlib.Tactic.CC.CCM.eraseROccs lhs lhs true Mathlib.Tactic.CC.CCM.eraseROccs rhs lhs false
Instances For
Insert lhs to the occurrences of arguments of e on the right hand side of
an equality in acR.
Equations
Instances For
Erase lhs to the occurrences of arguments of e on the right hand side of
an equality in acR.
Equations
Instances For
Try to simplify the right hand sides of equalities in acR by H : lhs = rhs.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Try to simplify the left hand sides of equalities in acR by H : lhs = rhs.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Given ra := a*r sb := b*s ts := t*s tr := t*r tsEqa : t*s = a trEqb : t*r = b,
return a proof for ra = sb.
We use a*b to denote an AC application. That is, (a*b)*(c*a) is the term a*a*b*c.
Equations
- One or more equations did not get rendered due to their size.
- Mathlib.Tactic.CC.CCM.mkACSuperposeProof ra sb a b r s ts (Mathlib.Tactic.CC.ACApps.apps op args) tsEqa trEqb = failure
- Mathlib.Tactic.CC.CCM.mkACSuperposeProof ra sb a b r s ts tr tsEqa trEqb = failure
Instances For
Given tsEqa : ts = a, for each equality trEqb : tr = b in acR where
the intersection t of ts and tr is nonempty, let ts = t*s and tr := t*r, add a new
equality r*a = s*b.
Equations
- One or more equations did not get rendered due to their size.
- Mathlib.Tactic.CC.CCM.superposeAC ts a tsEqa = pure PUnit.unit
Instances For
Process the tasks in the acTodo field.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Given AC variables e₁ and e₂ which are in the same equivalence class, add the proof of
e₁ = e₂ to the AC module.
Equations
- One or more equations did not get rendered due to their size.
Instances For
If the root expression of e is AC variable, add equality to AC module. If not, register the
AC variable to the root entry.
Equations
- One or more equations did not get rendered due to their size.
Instances For
If e isn't an AC variable, set e as an new AC variable.
Equations
- One or more equations did not get rendered due to their size.
Instances For
If e is of the form op e₁ e₂ where op is an associative and commutative binary operator,
return the canonical form of op.
Equations
- One or more equations did not get rendered due to their size.
- Mathlib.Tactic.CC.CCM.isAC e = pure none
Instances For
Internalize e so that the AC module can deal with the given expression.
If the expression does not contain an AC operator, or the parent expression
is already processed by internalizeAC, this operation does nothing.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The specialized internalizeCore for applications or literals.
Propagate equality from a and b to a ↔ b.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Propagate equality from a and b to a ∧ b.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Propagate equality from a and b to a ∨ b.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Propagate equality from a to ¬a.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Propagate equality from a and b to a → b.
Propagate equality from p, a and b to if p then a else b.
Equations
- One or more equations did not get rendered due to their size.
- Mathlib.Tactic.CC.CCM.propagateIteUp e = failure
Instances For
Propagate equality from a and b to disprove a = b.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Propagate equality from subexpressions of e to e.
This method is invoked during internalization and eagerly apply basic equivalences for term e
Examples:
In principle, we could mark theorems such as cast_eq as simplification rules, but this created
problems with the builtin support for cast-introduction in the ematching module in Lean 3.
TODO: check if this is now possible in Lean 4.
Eagerly merging the equivalence classes is also more efficient.
If e is a subsingleton element, push the equality proof between e and its canonical form
to the todo list or register e as the canonical form of itself.
Can we propagate equality from subexpressions of e to e?
Equations
- Mathlib.Tactic.CC.CCM.mayPropagate e = (e.isAppOfArity `Iff 2 || e.isAppOfArity `And 2 || e.isAppOfArity `Or 2 || e.isAppOfArity `Not 1 || e.isArrow || e.isIte)
Instances For
Remove parents of e from the congruence table and the symm congruence table, and append
parents to propagate equality, to parentsToPropagate.
Returns the new value of parentsToPropagate.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The fields target and proof in e's entry are encoding a transitivity proof
Let e.rootTarget and e.rootProof denote these fields.
e = e.rootTarget := e.rootProof
_ = e.rootTarget.rootTarget := e.rootTarget.rootProof
...
_ = e.root := ...
The transitivity proof eventually reaches the root of the equivalence class.
This method "inverts" the proof. That is, the target goes from e.root to e after
we execute it.
Reinsert parents of e to the congruence table and the symm congruence table.
Together with removeParents, this allows modifying parents of an expression.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Check for integrity of the CCStructure.
Equations
- Mathlib.Tactic.CC.CCM.checkInvariant = do let __do_lift ← get guard (__do_lift.checkInvariant = true)
Instances For
For each fnRoot in fnRoots traverse its parents, and look for a parent prefix that is
in the same equivalence class of the given lambdas.
remark All expressions in lambdas are in the same equivalence class
Equations
- One or more equations did not get rendered due to their size.
Instances For
Given c a constructor application, if p is a projection application (not .proj _ _ _, but
.app (.const projName _) _) such that major premise is
equal to c, then propagate new equality.
Example: if p is of the form b.fst, c is of the form (x, y), and b = c, we add the
equality (x, y).fst = x
Equations
- One or more equations did not get rendered due to their size.
Instances For
Given a new equality e₁ = e₂, where e₁ and e₂ are constructor applications.
Implement the following implications:
c a₁ ... aₙ = c b₁ ... bₙ => a₁ = b₁, ..., aₙ = bₙ
c₁ ... = c₂ ... => False
where c, c₁ and c₂ are constructors
Equations
- One or more equations did not get rendered due to their size.
Instances For
Derive contradiction if we can get equality between different values.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Propagate equality from ¬a to a.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Propagate equality from ¬∃ x, p x to ∀ x, ¬p x.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Propagate equality from e to subexpressions of e.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Performs one step in the process when the new equation is added.
Here, H contains the proof that e₁ = e₂ (if heqProof is false)
or HEq e₁ e₂ (if heqProof is true).
Equations
- One or more equations did not get rendered due to their size.
Instances For
The auxiliary definition for addEqvStep to flip the input.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Process the tasks in the todo field.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Internalize e so that the congruence closure can deal with the given expression.
Equations
Instances For
Add H : lhs = rhs or H : HEq lhs rhs to the congruence closure. Don't forget to internalize
lhs and rhs beforehand.
Equations
- Mathlib.Tactic.CC.CCM.addEqvCore lhs rhs H heqProof = do Mathlib.Tactic.CC.CCM.pushTodo lhs rhs (↑H) heqProof Mathlib.Tactic.CC.CCM.processTodo
Instances For
Add proof : type to the congruence closure.