Documentation

Pdl.Interpolation.Uniformity

Uniformity of split tableaux (Section 8.1) #

This file defines when a tableau is uniform, by the two conditions U1 and U2 of the paper, and shows that in a uniform tableau every loaded cluster has the property LoadedCluster.HasUniformSteps that the construction of the quasi-tableau needs.

Recall the two conditions from the paper, where Λ₁(s) and Λ₂(s) are the left and the right component of the sequent at the node s, and where i ∈ {1,2}:

Both conditions speak about the nodes of the tableau in the sense of the paper, i.e. also about the nodes inside the local tableaux. Hence we state them for FinePathIn tab. Note that in U2 the loaded component is not basic, so the rule applied at s and at t must be a local rule; we therefore phrase U2 using FinePathIn.lra?, and "the same rule applied to the same formula" becomes LocalRuleApp.SameRuleAs: the two rule applications have the same principal formulas (Lcond, Rcond and Ocond) and the same results (ress), and indeed use the same rule (lr).

The main result is LoadedCluster.uniformOfUniTab. Its proof splits into two cases, and only the second one uses uniformity:

Duplicated helper lemmas #

The file Pdl.ClusterInterpolation imports this file (it uses Tableau.isUniform and LoadedCluster.uniformOfUniTab), so we cannot use the lemmas about right rules that are proved there. The section Uniformity below therefore repeats those that are needed here, under different names.

The components of a sequent #

The left component of a sequent, together with the loaded formula, again as a sequent. This is Λ₁ from the paper; compare Sequent.rightOnly, which is Λ₂.

Equations
Instances For

    The left component of a sequent, without any loaded formula. When the loaded formula is on the right, i.e. in the situation of a LoadedCluster, this is the unloaded component Λ₁ of the node, and Sequent.leftFree X |>.basic says that no local rule is applicable to it.

    Equations
    Instances For

      The right component of a sequent, without any loaded formula. When the loaded formula is on the left this is the unloaded component Λ₂ of the node.

      Equations
      Instances For

        Two local rule applications use the same rule with the same principal formulas. The fields Lcond, Rcond and Ocond are the principal formulas and ress is the list of results of the rule, so this says that the same rule instance is applied at two nodes, which may still have different sequents.

        Equations
        Instances For

          Uniformity #

          def Tableau.U1 {H : History} {X : Sequent} (tab : Tableau H X) :

          Condition U1: at a node with a loaded component, a rule is applied to the unloaded component unless the latter is basic. Since every rule is a left rule or a right rule but not both (FinePathIn.not_left_and_right), we state this as: a rule on the unloaded side is applied.

          The condition is only about nodes at which a rule is applied at all, i.e. we exclude the leaves given by a loaded-path repeat, which is what ¬ f.base.isLrep says. Note that this exclusion is needed: at a loaded-path repeat the tableau stops, so no rule at all — and in particular no rule on the unloaded component — is applied there, while the sequent of a loaded-path repeat may well have a non-basic unloaded component. (For example, the sequent reached again after a loop may contain a conjunction on the unloaded side; the tableau is then forced to stop, because Tableau.loc and Tableau.pdl both require ¬ flprep.) Without the exclusion no tableau with such a repeat would be uniform, and Tableau.toUniform would fail.

          Equations
          • One or more equations did not get rendered due to their size.
          Instances For
            def Tableau.U2 {H : History} {X : Sequent} (tab : Tableau H X) :

            Condition U2: two nodes whose loaded component is the same and not basic, and whose unloaded components are both basic, apply the same rule to the same formula of the loaded component. As the loaded component is not basic the rule must be a local one, so we may state this for the local rule applications f.lra? and g.lra?.

            Equations
            • One or more equations did not get rendered due to their size.
            Instances For
              def Tableau.UniCore {H : History} {X : Sequent} (tab : Tableau H X) :

              The conditions U1 and U2 together.

              Equations
              Instances For
                theorem Tableau.uniCore_of_all_free {H : History} {X : Sequent} {tab : Tableau H X} (h : ∀ (f : FinePathIn tab), f.label.2.2 = none) :

                A sanity check that U1 and U2 are not contradictory: both conditions only constrain nodes with a loaded component, so a tableau in which no node is loaded satisfies them.

                def Tableau.isUniform {H : History} {X : Sequent} (tab : Tableau H X) :

                A tableau is uniform if it satisfies the conditions U1 and U2.

                We also demand U1 and U2 for the flipped tableau tab.flip, in which the left and the right components of all sequents are swapped. This is not an extra demand: U1 and U2 are symmetric in the two components, so tab.UniCore and tab.flip.UniCore say the same thing. Asking for both here only spares us the purely technical work of transporting U1 and U2 along Tableau.flip, which would need a flip operation on FinePathIn. What it buys us is Tableau.isUniform.flip below, which is needed because the interpolation proof flips the tableau when the loaded formula is on the left.

                Equations
                Instances For
                  theorem Tableau.UniCore.heq_transfer {H₁ : History} {X₁ : Sequent} {H₂ : History} {X₂ : Sequent} {t₁ : Tableau H₁ X₁} {t₂ : Tableau H₂ X₂} (hH : H₁ = H₂) (hX : X₁ = X₂) (h : t₁ t₂) (h₁ : t₁.UniCore) :
                  t₂.UniCore

                  Transporting Tableau.UniCore along an equality of tableaux.

                  theorem Tableau.isUniform.flip {H : History} {X : Sequent} {tab : Tableau H X} (h : tab.isUniform) :

                  Uniformity is preserved by flipping the tableau.

                  Uniform tableaux by construction #

                  To obtain uniform tableaux we follow approach (B): instead of repairing a given tableau we describe how a uniform one is built, by fixing which local rule is applied at each node. The conditions U1 and U2 only speak about the local rules applied at the nodes, and both are conditions that can be read off a single rule application together with the sequent it is applied to. This is what LocalRuleApp.IsUniChoice below says:

                  Since the canonical rule only depends on the loaded component Λᵢ(s), any two nodes with the same loaded component use the same rule, which is U2. A tableau all of whose rule applications are IsUniChoice is called Tableau.IsUni, and Tableau.IsUni.uniCore shows that such a tableau indeed satisfies U1 and U2. The construction is symmetric under flipping (Tableau.IsUni.flip), which gives the second half of Tableau.isUniform.

                  Flipping components, rules and rule applications #

                  @[simp]
                  theorem LocalRuleApp.flip_O (lra : LocalRuleApp) :
                  lra.flip.O = lra.O.flip
                  @[simp]
                  theorem LocalRuleApp.flip_X (lra : LocalRuleApp) :
                  lra.flip.X = lra.X.flip
                  theorem LocalRuleApp.SameRuleAs.flip {lra₁ lra₂ : LocalRuleApp} (h : lra₁.SameRuleAs lra₂) :
                  lra₁.flip.SameRuleAs lra₂.flip

                  Being the same rule is preserved by flipping.

                  Being the same rule is reflexive.

                  theorem LocalRuleApp.SameRuleAs.symm {lra₁ lra₂ : LocalRuleApp} (h : lra₁.SameRuleAs lra₂) :
                  lra₂.SameRuleAs lra₁

                  Being the same rule is symmetric.

                  theorem LocalRuleApp.SameRuleAs.trans {lra₁ lra₂ lra₃ : LocalRuleApp} (h : lra₁.SameRuleAs lra₂) (h' : lra₂.SameRuleAs lra₃) :
                  lra₁.SameRuleAs lra₃

                  Being the same rule is transitive.

                  The canonical rule for a component #

                  The canonical local rule to be applied to the right component of a sequent. We use the first right rule in the list LocalRuleApp.all of all applicable rules. Which rule exactly is picked does not matter for uniformity; all that matters is that this is a function of the sequent — and that it is applied to sequents of the form X.rightOnly, so that it only depends on the right component.

                  Equations
                  Instances For

                    The canonical local rule to be applied to the left component of a sequent. Defined as the flip of uniRightChoice, which makes the whole construction symmetric.

                    Equations
                    Instances For

                      Uniform rule applications #

                      The conditions on a single local rule application in a uniform tableau: the first two fields are the local form of U1 and the last two are the local form of U2.

                      Instances For

                        The conditions on rule applications are symmetric under flipping.

                        Basic sequents have basic components #

                        All local rule applications inside a local tableau are uniform choices.

                        Equations
                        Instances For
                          def Tableau.IsUni {H : History} {X : Sequent} :
                          Tableau H XProp

                          All local rule applications inside a tableau are uniform choices.

                          Equations
                          Instances For
                            theorem LocalTableau.IsUni.ltAt {X : Sequent} {lt : LocalTableau X} (h : lt.IsUni) (lp : LocalPathIn lt) :
                            theorem Tableau.IsUni.lra?_isUniChoice {H : History} {X : Sequent} {tab : Tableau H X} (h : tab.IsUni) {f : FinePathIn tab} {lra : LocalRuleApp} (hf : f.lra? = some lra) :
                            theorem FinePathIn.usesLeftRule_eq_of_lra? {H : History} {X : Sequent} {tab : Tableau H X} {f : FinePathIn tab} {lra : LocalRuleApp} (hf : f.lra? = some lra) :
                            theorem FinePathIn.usesRightRule_eq_of_lra? {H : History} {X : Sequent} {tab : Tableau H X} {f : FinePathIn tab} {lra : LocalRuleApp} (hf : f.lra? = some lra) :
                            theorem Tableau.IsUni.uniCore {H : History} {X : Sequent} {tab : Tableau H X} (h : tab.IsUni) :
                            theorem LocalTableau.IsUni_cast {A B : Sequent} (h : A = B) (t : LocalTableau A) :
                            (h t).IsUni t.IsUni
                            theorem Tableau.IsUni_cast {H : History} {A B : Sequent} (h : A = B) (t : Tableau H A) :
                            (h t).IsUni t.IsUni
                            theorem Tableau.IsUni.flip {H : History} {X : Sequent} {tab : Tableau H X} (h : tab.IsUni) :
                            theorem Tableau.IsUni.isUniform {X : Sequent} {tab : Tableau [] X} (h : tab.IsUni) :

                            A tableau all of whose local rule applications are uniform choices is uniform.

                            Building a uniform tableau #

                            We now show Tableau.exists_isUni: for every tableau there is one that applies the rules in the canonical order. The construction is deterministic: uniChoiceAt picks, at each sequent, the canonical rule application (first a rule for the unloaded component, and once that is basic the canonical rule for the loaded component), and uniLocalTab iterates this to a local tableau all of whose rule applications are uniform choices (uniLocalTab_isUni).

                            Given an arbitrary tableau we then re-build it, replacing the local tableau at each loc step by the canonical one. Because the end nodes of the canonical local tableau need not be literally the same lists as the end nodes of the original one, we prove the statement in the more flexible form Tableau.exists_isUni_of_msEq, allowing the sequent and the history to change up to Sequent.multisetEqTo, i.e. up to permutation of the two lists in a sequent. That the calculus does not care about such permutations is PdlRule.exists_of_multisetEqTo and lpr_of_multisetEqTo.

                            The only step that is left open is uniLocalTab_endNode_dominated.

                            def LocalRuleApp.inContext (lra : LocalRuleApp) (L R : Finset Formula) (O : Olf) (hL : lra.LcondL) (hR : lra.RcondR) (hO : lra.Ocond O) :

                            Put a local rule application into a different context, keeping the rule itself.

                            Equations
                            • lra.inContext L R O hL hR hO = { L := L, R := R, O := O, Lcond := lra.Lcond, Rcond := lra.Rcond, Ocond := lra.Ocond, ress := lra.ress, lr := lra.lr, hC := , preconditionProof := }
                            Instances For

                              Put a local rule application into the context of the sequent X, if possible.

                              Equations
                              Instances For
                                theorem LocalRuleApp.toContext_X (lra : LocalRuleApp) (X : Sequent) (h : lra.LcondX.1 lra.RcondX.2.1 lra.Ocond X.2.2) :
                                (lra.toContext X).X = X
                                theorem uniRightChoice_spec {Y : Sequent} {lra : LocalRuleApp} (h : uniRightChoice Y = some lra) :
                                lra.X = Y lra.isRightRule = true
                                theorem uniRightChoice_isSome {Y : Sequent} {lra : LocalRuleApp} (hX : lra.X = Y) (hr : lra.isRightRule = true) :
                                theorem uniLeftChoice_spec {Y : Sequent} {lra : LocalRuleApp} (h : uniLeftChoice Y = some lra) :
                                lra.X = Y lra.isLeftRule = true
                                theorem uniLeftChoice_isSome {Y : Sequent} {lra : LocalRuleApp} (hX : lra.X = Y) (hl : lra.isLeftRule = true) :

                                Shapes of left and right rules #

                                Any local rule applicable to a sequent of the shape (L, ∅, none) is a left rule.

                                Moving rules between a sequent and its components #

                                theorem LocalRuleApp.toContext_leftOnly_X {lra : LocalRuleApp} {X : Sequent} (hX : lra.X = X) (hl : lra.isLeftRule = true) :
                                theorem LocalRuleApp.toContext_leftFree_X {lra : LocalRuleApp} {X : Sequent} (hX : lra.X = X) (hl : lra.isLeftRule = true) (hO : lra.Ocond = none) :

                                When is the canonical choice available? #

                                theorem exists_localRuleApp_of_not_basic {Y : Sequent} (h : ¬Y.basic) :
                                ∃ (lra : LocalRuleApp), lra.X = Y

                                The canonical rule choice #

                                The canonical rule application for a sequent that is free or loaded on the right: first reduce the left component, then use the canonical rule for the right component.

                                Equations
                                • One or more equations did not get rendered due to their size.
                                Instances For
                                  theorem uniChoiceRL_X {X : Sequent} {lra : LocalRuleApp} (h : uniChoiceRL X = some lra) :
                                  lra.X = X
                                  theorem uniChoiceRL_isUniChoice {X : Sequent} {lra : LocalRuleApp} (hnl : ¬X.2.2.isLeft) (h : uniChoiceRL X = some lra) :

                                  The canonical local rule application at a sequent: when the sequent is loaded on the left we flip, use uniChoiceRL and flip back.

                                  Equations
                                  Instances For
                                    theorem uniChoiceAt_X {X : Sequent} {lra : LocalRuleApp} (h : uniChoiceAt X = some lra) :
                                    lra.X = X
                                    theorem uniChoiceAt_C_lt {X : Sequent} {lra : LocalRuleApp} (h : uniChoiceAt X = some lra) {Y : Sequent} (hY : Y lra.C) :
                                    @[irreducible]

                                    The canonical local tableau: always apply the canonical rule uniChoiceAt.

                                    Equations
                                    • One or more equations did not get rendered due to their size.
                                    Instances For

                                      Refutable sequents #

                                      To show that the local development of a sequent does not depend on the order in which the rules are applied we have to deal with clashes: one local tableau may close a branch with a closure rule while another one first decomposes the two clashing formulas. So we need to know that a clash cannot get lost, i.e. that after applying any local rule to a closed sequent the resulting sequents can still be closed.

                                      We call a sequent Refutable if it has a local tableau without any end nodes. Note that we only ask for the existence of such a local tableau; this is all that is needed below, and it can be shown by purely syntactic means: the interesting case is when the rule applied is the box or the diamond unfolding for the two clashing formulas ⌈α⌉ψ and ~⌈α⌉ψ. There the branches of unfoldBox and of unfoldDiamond clash pairwise, either on a test or on a formula ⌈⌈δ⌉⌉ψ, which is Dset_mem_P_of_tests below.

                                      theorem Dset_mem_P_of_tests (α : Program) ( : TP α) (Fs : List Formula) (δ : List Program) (h : (Fs, δ) Dset α) (hF : τFs, ~τF α ) :
                                      δ P α

                                      Refutable and dominated sequents #

                                      The sequent W is dominated by the finite set Ys if it has a local tableau all of whose end nodes occur in Ys.

                                      Equations
                                      Instances For

                                        A sequent is refutable if it has a local tableau without any end nodes.

                                        Equations
                                        Instances For
                                          theorem Sequent.DominatedBy.mono {W : Sequent} {Ys Zs : Finset Sequent} (h : W.DominatedBy Ys) (hsub : YsZs) :
                                          theorem Sequent.DominatedBy.byRule {W : Sequent} {Ys : Finset Sequent} {lra : LocalRuleApp} (hX : lra.X = W) (h : Vlra.C, V.DominatedBy Ys) :

                                          If all children of a rule application are dominated by Ys then so is the sequent.

                                          A closed sequent is refutable: a closure rule can be applied to it.

                                          Clashes survive the application of a rule #

                                          The next lemmas say that a clash in a sequent cannot be lost by applying a local rule: the results are again refutable. The interesting cases are those where the rule is applied to one of the two clashing formulas.

                                          theorem Sequent.Refutable.byOneSided {X : Sequent} {p : Formula} {ress : Finset (Finset Formula)} (orule : OneSidedLocalRule {p} ress) (hp : p X) (h : resress, ∀ (W : Sequent), (∀ fX, f pf W)(∀ φres, φ W)W.Refutable) :

                                          To show that X is refutable it suffices to apply a one-sided rule to a formula p of X and to refute all the results. The resulting sequents are only described by two properties, so that we do not have to care about which of the two components p is in: all formulas of X other than p are still present, and the result of the rule was added.

                                          Two formulas of different length are different.

                                          Two formulas of different length are different.

                                          theorem Sequent.closed.append {L R Ln Rn : Finset Formula} {O O' : Olf} (hX : closed (L, R, O)) :
                                          closed (L Ln, R Rn, O')

                                          Adding formulas to a closed sequent keeps it closed.

                                          theorem OneSidedLocalRule.singleton_precond {pre : Finset Formula} {ress : Finset (Finset Formula)} (orule : OneSidedLocalRule pre ress) (h : ress ) :
                                          ∃ (p : Formula), pre = {p}

                                          A one-sided rule that is not a closure rule has exactly one principal formula.

                                          Tests are shorter than the program they occur in.

                                          theorem boxes_ne_neg {δ : List Program} {ψ χ : Formula} (h : lengthOfFormula ψ lengthOfFormula χ) :

                                          A list of boxes in front of a short formula is not the negation of a longer one.

                                          theorem ne_neg_box_of_mem_Bset {α : Program} {ψ : Formula} { : TP α} {f : Formula} (hf : f Bset α ψ) :
                                          f ~αψ

                                          A formula in the unfolding of ⌈α⌉ψ is not ~⌈α⌉ψ.

                                          theorem ne_box_of_mem_Yset {α : Program} {ψ : Formula} {Fs : List Formula} {δ : List Program} (hFδ : (Fs, δ) Dset α) {f : Formula} (hf : f Yset (Fs, δ) ψ) :
                                          (f αψ) f ~~αψ

                                          A formula in the unfolding of ~⌈α⌉ψ is neither ⌈α⌉ψ nor ~~⌈α⌉ψ.

                                          theorem Bset_Yset_clash {α : Program} {ψ : Formula} ( : TP α) {Fs : List Formula} {δ : List Program} (hFδ : (Fs, δ) Dset α) :
                                          ∃ (f : Formula), f Bset α ψ ~f Yset (Fs, δ) ψ ~f Bset α ψ f Yset (Fs, δ) ψ

                                          The branches of the box unfolding and of the diamond unfolding clash. Given a test profile and a pair (Fs, δ) ∈ Dset α, the two lists Bset α ℓ ψ and Yset (Fs, δ) ψ contain a formula and its negation: either the two disagree about a test, or δ ∈ P α ℓ and then ⌈⌈δ⌉⌉ψ is in the first and ~⌈⌈δ⌉⌉ψ is in the second list.

                                          theorem refutable_of_negneg {X : Sequent} {χ : Formula} (h1 : χ X) (h2 : ~ ~~χ X) :
                                          theorem refutable_of_con_nCo {X : Sequent} {χ ρ : Formula} (h1 : χ X) (h2 : ρ X) (h3 : ~(χ ρ) X) :
                                          theorem refutable_of_nCo_con {X : Sequent} {χ ρ : Formula} (h1 : ~χ X ~ρ X) (h2 : χ ρ X) :
                                          theorem refutable_of_nCo_negneg {X : Sequent} {χ ρ : Formula} (h1 : ~χ X ~ρ X) (h2 : ~~(χ ρ) X) :
                                          theorem refutable_of_box_dia {X : Sequent} {α : Program} {ψ : Formula} { : TP α} (hna : ¬α.isAtomic) (hB : φBset α ψ, φ X) (hd : (~αψ) X) :
                                          theorem refutable_of_dia_box {X : Sequent} {α : Program} {ψ : Formula} {Fs : List Formula} {δ : List Program} (hna : ¬α.isAtomic) (hFδ : (Fs, δ) Dset α) (hY : φYset (Fs, δ) ψ, φ X) (hb : (αψ) X) :
                                          theorem refutable_of_dia_negneg {X : Sequent} {α : Program} {ψ : Formula} {Fs : List Formula} {δ : List Program} (hna : ¬α.isAtomic) (hFδ : (Fs, δ) Dset α) (hY : φYset (Fs, δ) ψ, φ X) (hb : (~~αψ) X) :
                                          theorem Sequent.Refutable.of_oneSided_step {X W : Sequent} (hX : X.closed) {p : Formula} {pre : Finset Formula} {ress : Finset (Finset Formula)} (orule : OneSidedLocalRule pre ress) (hpre : pre = {p}) {res : Finset Formula} (hres : res ress) (hsurv : fX, f pf W) (hmem : φres, φ W) :

                                          A clash survives a one-sided rule. If X is closed and W is obtained from X by removing the principal formula p of a one-sided rule and adding one of its results, then W is refutable.

                                          theorem Sequent.Refutable.child_of_closed {X W : Sequent} (hX : X.closed) {lra : LocalRuleApp} (hXl : lra.X = X) (hW : W lra.C) :

                                          A clash survives any local rule: every child of a rule application to a closed sequent is refutable.

                                          Closure rules #

                                          A local rule has no results if and only if it is one of the closure rules. For the direction we need here we must know that the box and diamond unfoldings are never empty.

                                          theorem unfoldBox_ne_nil (a : Program) (phi : Formula) :

                                          The box unfolding is never empty.

                                          theorem Dset_ne_nil (a : Program) :

                                          The program unfolding used for diamonds is never empty.

                                          A rule without results is a closure rule, so the sequent it is applied to is closed.

                                          theorem LocalRuleApp.shape_of_ress_ne_nil {lra : LocalRuleApp} (h : lra.ress ) :
                                          (∃ (p : Formula), lra.Lcond = {p} lra.Rcond = lra.Ocond = none Ylra.ress, Y.2.2 = none) (∃ (p : Formula), lra.Lcond = lra.Rcond = {p} lra.Ocond = none Ylra.ress, Y.2.2 = none) lra.Lcond = lra.Rcond = lra.Ocond none

                                          The shape of a rule application that is not a closure rule: it has exactly one principal formula, in the left component, in the right component, or the loaded formula.

                                          theorem LocalRuleApp.Ocond_eq_O {lra : LocalRuleApp} (h : lra.Ocond none) :
                                          lra.Ocond = lra.O

                                          A loaded rule can only be applied when its condition is the loaded formula present.

                                          theorem LocalRuleApp.C_eq (lra : LocalRuleApp) :
                                          lra.C = Finset.image (fun (Z : Sequent) => (lra.L \ lra.Lcond Z.1, lra.R \ lra.Rcond Z.2.1, lra.O.change lra.Ocond Z.2.2)) lra.ress

                                          The children of a rule application, written out.

                                          theorem LocalRuleApp.exists_at (lra : LocalRuleApp) (Y : Sequent) (hL : lra.LcondY.1) (hR : lra.RcondY.2.1) (hO : lra.Ocond Y.2.2) :
                                          ∃ (lra' : LocalRuleApp), lra'.X = Y lra'.C = Finset.image (fun (Z : Sequent) => (Y.1 \ lra.Lcond Z.1, Y.2.1 \ lra.Rcond Z.2.1, Y.2.2.change lra.Ocond Z.2.2)) lra.ress

                                          A rule can be applied at any sequent that satisfies its precondition.

                                          theorem endNodesOf_of_basic {X : Sequent} (bas : X.basic) (lt : LocalTableau X) :

                                          A local tableau for a basic sequent has that sequent as its only end node.

                                          Helpers #

                                          These are copies of results in Pdl.ClusterInterpolation, which are not available here because that file imports this one.

                                          The right component of a basic sequent is basic. Same as Sequent.basic_rightOnly in Pdl.ClusterInterpolation.

                                          A right local rule cannot be applied when the right component of the sequent is basic. Same as LocalRuleApp.not_rightOnly_basic_of_isRightRule in Pdl.ClusterInterpolation.

                                          theorem Uniformity.lra_or_basic_of_usesRightRule {H : History} {Z : Sequent} {tab' : Tableau H Z} (f : FinePathIn tab') :

                                          Where a right rule is applied, it is either a local rule or the node is basic. Same as FinePathIn.lra_or_basic_of_usesRightRule in Pdl.ClusterInterpolation.

                                          The right component of the child obtained by applying the modal rule (M) to a sequent whose loaded formula ~⌊·A⌋ξ is on the right. Same as modRChildRightOnly in Pdl.ClusterInterpolation.

                                          Equations
                                          Instances For
                                            theorem Uniformity.basicRightStep {H : History} {Z : Sequent} {tab' : Tableau H Z} (f : FinePathIn tab') (h : f.usesRightRule = true) (hb : f.label.rightOnly.basic) :

                                            At a fine node with a basic right component where a right rule is applied, that rule is one of the three PdlRules acting on the right. Same as FinePathIn.basicRightStep in Pdl.ClusterInterpolation.

                                            theorem Uniformity.label_eq_nodeAt_base {H : History} {Z : Sequent} {tab' : Tableau H Z} (f : FinePathIn tab') (h : f.atBigRoot = true) :

                                            A fine node that is a node in the coarse sense has the label of that coarse node. Same as FinePathIn.label_eq_nodeAt_base in Pdl.ClusterInterpolation.

                                            theorem Uniformity.isRight_of_mem_C (lra : LocalRuleApp) (Y : Sequent) :
                                            Y lra.CY.2.2.isRightlra.X.2.2.isRight

                                            If a child of a local rule application is loaded on the right, then so is its premise. Same as LocalRuleApp.isRight_of_mem_C in Pdl.ClusterInterpolation.

                                            theorem Uniformity.isRight_of_mem_endNodesOf {Z : Sequent} (lt : LocalTableau Z) (Y : Sequent) :
                                            Y endNodesOf ltY.2.2.isRightZ.2.2.isRight

                                            If some end node of a local tableau is loaded on the right, then so is its root. Same as LocalTableau.isRight_of_mem_endNodesOf in Pdl.ClusterInterpolation.

                                            theorem Uniformity.mem_endNodesOf_ltAt {Z : Sequent} {lt : LocalTableau Z} (lp : LocalPathIn lt) (Yh : (endNodesOf lt)) :
                                            Yh lp.endNodesBelowYh endNodesOf lp.ltAt

                                            The end nodes below a local path are end nodes of the local tableau at that path. Same as LocalPathIn.mem_endNodesOf_ltAt in Pdl.ClusterInterpolation.

                                            theorem Uniformity.isRight_of_mem_coarseChildrenBelow {H : History} {Z : Sequent} {tab' : Tableau H Z} (f : FinePathIn tab') :
                                            ¬f.atBigRoot = trueqf.coarseChildrenBelow, (nodeAt q).2.2.isRightf.label.2.2.isRight

                                            A fine node that is not a coarse node and has a coarse child loaded on the right is itself loaded on the right. Same as FinePathIn.isRight_of_mem_coarseChildrenBelow in Pdl.ClusterInterpolation.

                                            theorem Uniformity.isRight_of_memFine {X : Sequent} {tab : Tableau [] X} (C : LoadedCluster tab) {f : FinePathIn tab} (hf : C.memFine f) :

                                            Lemma 9.4 (a) at the fine level: every fine node of a loaded cluster is loaded on the right. For a coarse node this is LoadedCluster.all_right_loaded, and for a node inside a local tableau it follows because that node has a coarse child in the cluster.

                                            theorem Uniformity.basicModalStep {X : Sequent} {tab : Tableau [] X} (C : LoadedCluster tab) {Δ : Sequent} (hb : Δ.basic) {t : FinePathIn tab} (ht : t C.nodesWithFineRight Δ) :
                                            ∃ (A : ) (ξ : AnyFormula), Δ.2.2 = some (Sum.inr (~'·Aξ)) ∃ (g : FinePathIn tab), t.children = {g} g.label.rightOnly = modRChildRight A ξ Δ.2.1

                                            Lemma 9.7 (e): at a node t of C^R_Δ with Δ basic the rule applied is the modal rule (M) for the loaded formula ~⌊·A⌋ξ of Δ, so that the right component of the unique child of t only depends on Δ. Same as LoadedCluster.basicModalStepAt in Pdl.ClusterInterpolation.

                                            theorem Uniformity.map_rightOnly_C_eq {lra₁ lra₂ : LocalRuleApp} (hsame : lra₁.SameRuleAs lra₂) (hX : lra₁.X.rightOnly = lra₂.X.rightOnly) :

                                            The key computation for condition U2: if the same local rule with the same principal formulas is applied at two nodes with the same right component, then the right components of the children agree, including their order. This holds because a local rule application deletes the principal formulas from, and adds the results to, the given sequent.

                                            theorem LoadedCluster.uniformOfUniTab {X : Sequent} {tab : Tableau [] X} (C : LoadedCluster tab) (uni_tab : tab.isUniform) :

                                            In a uniform tableau any loaded cluster has the property HasUniformSteps needed for the construction of the quasi-tableau: any two nodes of the cluster with the same right component Δ at which a right rule is applied have the same right components below them.

                                            The case where Δ is basic does not use uniformity: there the rule applied is the modal rule for the loaded formula of Δ (Lemma 9.7 (e)). The case where Δ is not basic is Lemma 9.7 (f), and uses both U1 and U2.