Documentation

Pdl.PartInterpolation

Interpolants for Partitions (big part of Section 7) #

Note that we can skip much of subsection 7.3 because we worked already with split tableaux anyway.

Joint vocabulary #

def jvoc (X : Sequent) :

The joint vocabulary occurring on both the left and the right side.

Equations
Instances For
    theorem jvoc_sub_of_voc_sub {Y X : Sequent} (hl : Y.left.fvoc X.left.fvoc) (hr : Y.right.fvoc X.right.fvoc) :

    Partition Interpolants #

    Like Olf.voc but without the ⊕ inside.

    Equations
    Instances For
      Equations
      Instances For

        Interpolants for local rules #

        theorem LoadRule_voc {χ : LoadFormula} {ress : List (List Formula × Option NegLoadFormula)} (lr : LoadRule (~'χ) ress) :
        lfovoc ress χ.voc
        theorem localRule_does_not_increase_vocab_L {Cond : Sequent} {B : List Sequent} (rule : LocalRule Cond B) (res : Sequent) :
        res Bres.left.fvoc Cond.left.fvoc
        theorem localRule_does_not_increase_vocab_R {Cond : Sequent} {B : List Sequent} (rule : LocalRule Cond B) (res : Sequent) :
        res Bres.right.fvoc Cond.right.fvoc
        def localInterpolantStep (lra : LocalRuleApp) (subθs : (c : Sequent) → c lra.CPartInterpolant c) :

        Maehara's method for single-step local rule applications. This covers easy cases without any loaded path repeats. We do not use localRuleTruth to prove this, but the more specific lemmas oneSidedL_sat_down and oneSidedL_sat_down.

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

          Interpolants for Local Tableau #

          def LocalTableau.interpolant {X : Sequent} (ltX : LocalTableau X) (endθs : (Y : Sequent) → Y endNodesOf ltXPartInterpolant Y) :
          Equations
          • One or more equations did not get rendered due to their size.
          Instances For

            Interpolants for PdlRules applied to free nodes #

            The only rule treated here is (L+), i.e. loadL and loadR.

            def freePdlRuleInterpolant {X Y : Sequent} (r : PdlRule X Y) (Xfree : X.isFree = true) (θY : PartInterpolant Y) :
            Equations
            • One or more equations did not get rendered due to their size.
            Instances For

              Cluster tools #

              def repeatsOf {X : Sequent} {tab : Tableau [] X} (s : PathIn tab) :
              List (PathIn tab)
              Equations
              Instances For
                def all_cEdge {X : Sequent} {tab : Tableau [] X} (s : PathIn tab) :
                List (PathIn tab)
                Equations
                Instances For
                  theorem all_cEdge_spec {X : Sequent} {tab : Tableau [] X} (s t : PathIn tab) :
                  t all_cEdge s s ⋖_ t s t
                  def all_cEdge_rev {X : Sequent} {tab : Tableau [] X} (t : PathIn tab) :
                  List (PathIn tab)
                  Equations
                  Instances For
                    theorem all_cEdge_rev_spec {X : Sequent} {tab : Tableau [] X} (s t : PathIn tab) :
                    def loadedBelow {a✝ : History} {a✝¹ : Sequent} {tab : Tableau a✝ a✝¹} :
                    PathIn tabList (PathIn tab)

                    Loaded nodes "below" the given one, also allowing ♥ steps.

                    Equations
                    Instances For
                      def loadedAbove {a✝ : History} {a✝¹ : Sequent} {tab : Tableau a✝ a✝¹} :
                      PathIn tabList (PathIn tab)

                      Loaded nodes "above" the given one, also allowing backwards ♥ steps.

                      Equations
                      Instances For
                        def clusterListOf {a✝ : History} {a✝¹ : Sequent} {tab : Tableau a✝ a✝¹} (p : PathIn tab) :
                        List (PathIn tab)

                        List of all other nodes in the same cluster, essentially a constructive version of clusterOf. Computed as the intersection of loadedAbove and loadedBelow.

                        Equations
                        Instances For
                          theorem clusterListOf_spec {a✝ : Sequent} {tab : Tableau [] a✝} {q : PathIn tab} (p : PathIn tab) :
                          def rootOf {a✝ : History} {a✝¹ : Sequent} {tab : Tableau a✝ a✝¹} :
                          List (PathIn tab)PathIn tab
                          Equations
                          Instances For
                            theorem cluster_all_left_loaded {a✝ : History} {a✝¹ : Sequent} {tab : Tableau a✝ a✝¹} {p : PathIn tab} (h : (nodeAt p).2.2.isLeft) (q : PathIn tab) :
                            q clusterListOf p(nodeAt q).2.2.isLeft

                            Lemma 7.22 (b) for left side

                            theorem cluster_all_right_loaded {a✝ : History} {a✝¹ : Sequent} {tab : Tableau a✝ a✝¹} {p : PathIn tab} (h : (nodeAt p).2.2.isRight) (q : PathIn tab) :

                            Lemma 7.22 (b) for right side

                            Equations
                            Instances For

                              Quasi-Tableaux #

                              inductive Typ :
                              Instances For
                                inductive QuasiTab :

                                Simple tree data type for Q in Def. 7.31.

                                Instances For
                                  @[irreducible]
                                  def Qchildren (C : List Sequent) (k : Typ) (Hist : List Sequent) (X : Sequent) :
                                  Equations
                                  Instances For
                                    def Q {a✝ : History} {a✝¹ : Sequent} {tab : Tableau a✝ a✝¹} {r : PathIn tab} :

                                    Quasi-Tableau from Def 7.31. Here we "start the construction", then use Qchildren. No names for the nodes as we use an inductive type, so we just write X for Δₓ

                                    Equations
                                    Instances For

                                      Interpolants for proper clusters #

                                      def exitsOf {Hist : History} {X : Sequent} (tab : Tableau Hist X) :
                                      List (PathIn tab)

                                      Helper for exitsOf. Or replace it fully with this?

                                      Equations
                                      Instances For
                                        theorem loaded_iff_exitsOf_non_nil {Hist : History} {X : Sequent} {tab : Tableau Hist X} :
                                        X.isLoaded = true qexitsOf tab, q PathIn.nil
                                        def PathIn.children {a✝ : History} {a✝¹ : Sequent} {tab : Tableau a✝ a✝¹} (p : PathIn tab) :
                                        List (PathIn tab)
                                        Equations
                                        Instances For
                                          def clusterInterpolation_right {Hist : History} {L R : List Formula} {nlf : NegLoadFormula} (tab : Tableau Hist (L, R, some (Sum.inr nlf))) (exitIPs : (e : PathIn tab) → e exitsOf tabPartInterpolant (nodeAt e)) :

                                          Specific version of clusterInterpolation where loaded formula is on the right side. This may need additional hypotheses to say that we start at the root of the cluster.

                                          Equations
                                          Instances For
                                            theorem PathIn.loc_flip {L R : List Formula} {nlf : NegLoadFormula} {Hist : List Sequent} {nrep' : ¬rep Hist (L, R, some (Sum.inl nlf))} {nbas' : ¬Sequent.basic (L, R, some (Sum.inl nlf))} (nrep : ¬rep (List.map Sequent.flip Hist) (Sequent.flip (L, R, some (Sum.inl nlf)))) (nbas : ¬(Sequent.flip (L, R, some (Sum.inl nlf))).basic) (lt : LocalTableau (L, R, some (Sum.inl nlf))) (next : (Y : Sequent) → Y endNodesOf ltTableau ((L, R, some (Sum.inl nlf)) :: Hist) Y) (next' : (Yf : Sequent) → Yf endNodesOf lt.flipTableau (List.map Sequent.flip ((L, R, some (Sum.inl nlf)) :: Hist)) Yf) (Y : Sequent) (Y_in : Y endNodesOf lt) (p : PathIn (next Y Y_in)) (Yf_in : Y.flip endNodesOf lt.flip) (h_next : (next Y Y_in).flip = next' Y.flip Yf_in) (h : Tableau.loc nrep nbas lt.flip next' = (Tableau.loc nrep' nbas' lt next).flip) :
                                            (loc Y_in nil).flip = h loc Yf_in nil

                                            TODO messy helper for mem_existsOf_of_flip

                                            The following lemma about PathIn.flip is here because it is also about exitsOf.

                                            @[irreducible]
                                            theorem mem_existsOf_of_flip {Hist : History} {L R : List Formula} {lr_nlf : NegLoadFormula NegLoadFormula} {tab : Tableau Hist (L, R, some lr_nlf)} (s : PathIn tab.flip) (s_in : s exitsOf tab.flip) :
                                            s.flip exitsOf tab
                                            def exitsOf_flip {Hist : History} {L R : List Formula} {nlf : NegLoadFormula NegLoadFormula} {tab : Tableau Hist (L, R, some nlf)} (exitIPs : (e : PathIn tab) → e exitsOf tabPartInterpolant (nodeAt e)) (e : PathIn tab.flip) :
                                            Equations
                                            • One or more equations did not get rendered due to their size.
                                            Instances For

                                              When X is an interpolant for X, then is an interpolant for X.flip.

                                              def clusterInterpolation {Hist : History} {L R : List Formula} {snlf : NegLoadFormula NegLoadFormula} (tab : Tableau Hist (L, R, some snlf)) (exitIPs : (e : PathIn tab) → e exitsOf tabPartInterpolant (nodeAt e)) :

                                              Given a tableau where the root is loaded, and exit interpolants, interpolate the root.

                                              Equations
                                              • One or more equations did not get rendered due to their size.
                                              Instances For
                                                theorem tabToIntAt {X : Sequent} (tab : Tableau [] X) (s : PathIn tab) :
                                                ∃ (θ : Formula), isPartInterpolant (nodeAt s) θ

                                                Ideally this would be a computable def and not an existential. But currently PathIn.strong_upwards_inductionOn only works with Prop motive.

                                                theorem tabToInt {X : Sequent} (tab : Tableau [] X) :
                                                ∃ (θ : Formula), isPartInterpolant X θ