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} {L R : List Formula} {nlf : NegLoadFormula NegLoadFormula} (tab : Tableau Hist (L, R, some nlf)) :
                                      List (PathIn tab)

                                      The exits of a cluster: (C \ C+).

                                      Equations
                                      Instances For
                                        def PathIn.children {a✝ : History} {a✝¹ : Sequent} {tab : Tableau a✝ a✝¹} (p : PathIn tab) :
                                        List (PathIn tab)
                                        Equations
                                        Instances For
                                          def plus_exits {X : Sequent} {tab : Tableau [] X} (C : List (PathIn tab)) :
                                          List (PathIn tab)

                                          Exits from a given list of nodes. Something like this should get us from C to C+.

                                          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.

                                            Equations
                                            Instances For

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

                                              theorem mem_existsOf_of_flip {Hist : History} {L R : List Formula} {nlf : NegLoadFormula NegLoadFormula} {tab : Tableau Hist (L, R, some nlf)} {s : PathIn tab.flip} (s_in : s exitsOf tab.flip) :
                                              s.flip exitsOf tab
                                              def exitsOf_flip {a✝ : History} {fst✝ fst✝¹ : List Formula} {val✝ : NegLoadFormula NegLoadFormula} {tab : Tableau a✝ (fst✝, fst✝¹, some val✝)} (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.edge_upwards_inductionOn only works with Prop motive.

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