Finding interpolants #
Here we show that given a finite GL-split proof, we can always find suitable interpolants.
Get the entire underlying sequent of a finite proof.
Equations
Instances For
Find n such that for all m β₯ n, m is not in an the variables of the proof.
Equations
- π.freeVar = Sequent.freshVar π.Sequent
Instances For
For each x in a finite proof, find a free variable.
Equations
- Split.encodeVar x = π.freeVar + β((Fintype.equivFin π.X) x)
Instances For
noncomputable def
Split.unencodeVar
{π : Proof}
[Fintype π.X]
(n : β)
(h1 : n - π.freeVar < Fintype.card π.X)
:
π.X
Given n which is in the range of the free variables, unencode n back to its node in the proof.
Equations
- Split.unencodeVar n h1 = (Fintype.equivFin π.X).symm β¨n - π.freeVar, h1β©
Instances For
The encodeVar function is injective.
unencodeVar is a left inverse of encodeVar.
theorem
Split.encodeVar_helperβ
{π : Proof}
[fin_X : Fintype π.X]
{Y : Finset π.X}
{n : β}
(h : n β Finset.image encodeVar Y)
:
noncomputable def
Split.extend
{π : Proof}
[fin_X : Fintype π.X]
{Y : Finset π.X}
(Y_sub : Y β Fintype.elems)
(Ο : { x : π.X // x β Y } β Formula)
:
Extend a substitution specific to encoded variables to all formulas.
Equations
- Split.extend Y_sub Ο Formula.bottom = β₯
- Split.extend Y_sub Ο Formula.top = β€
- Split.extend Y_sub Ο (at n) = if h : n β Finset.image Split.encodeVar Y then Ο β¨Split.unencodeVar n β―, β―β© else at n
- Split.extend Y_sub Ο (na n) = if h : n β Finset.image Split.encodeVar Y then ~Ο β¨Split.unencodeVar n β―, β―β© else na n
- Split.extend Y_sub Ο (A&B) = (Split.extend Y_sub Ο A&Split.extend Y_sub Ο B)
- Split.extend Y_sub Ο (A v B) = (Split.extend Y_sub Ο A v Split.extend Y_sub Ο B)
- Split.extend Y_sub Ο (β‘A) = β‘Split.extend Y_sub Ο A
- Split.extend Y_sub Ο (βA) = βSplit.extend Y_sub Ο A
Instances For
theorem
Split.Solution_strong_helper
{p : β β Prop}
[DecidablePred p]
(Ο : Subtype p β Formula)
(n : β)
{B A : Formula}
:
Helper for Solution strong, gives interaction between single substitution and partial substitution.
@[irreducible]
noncomputable def
Split.Solution_strong
{π : Proof}
[fin_X : Fintype π.X]
{Y : Finset π.X}
(Y_sub : Y β Fintype.elems)
:
Strong solution towards finding interpolants.
Equations
- One or more equations did not get rendered due to their size.
Instances For
@[irreducible]
theorem
Split.Solution_strong_prop
{π : Proof}
[fin_X : Fintype π.X]
(Y : Finset π.X)
(Y_sub : Y β Fintype.elems)
(n : { n : β // n β Finset.image encodeVar Y })
:
(Solution_strong Y_sub n = partial_ (Solution_strong Y_sub) (equation (unencodeVar βn β―)) β¨ (Solution_strong Y_sub nβ
partial_ (Solution_strong Y_sub) (equation (unencodeVar βn β―)))) β§ (β m β (Solution_strong Y_sub n).vocab,
m β (f (r π.Ξ± (unencodeVar βn β―))).left.vocab β© (f (r π.Ξ± (unencodeVar βn β―))).right.vocab βͺ Finset.image encodeVar Fintype.elems \ Finset.image encodeVar Y) β§ β (y : π.X),
encodeVar y β (partial_ (Solution_strong Y_sub) (atβn)).vocab β
Relation.ReflTransGen (edge π.Ξ±) (unencodeVar βn β―) y
Proves the Solution_strong satisfies the necessary properties.
Equations
- Split.Interpolant π = partial_ (Split.Solution_strong β―)