Documentation

Pdl.Soundness

Soundness (Section 6) #

Soundness of the PDL rules #

theorem pdlRuleSat {X Y : Sequent} (r : PdlRule X Y) (satX : HasSat.satisfiable X) :

The PDL rules are sound.

Companion, cEdge, etc. #

def companionOf {X : Sequent} {tab : Tableau [] X} (s : PathIn tab) (lpr : LoadedPathRepeat (tabAt s).fst (tabAt s).snd.fst) :
(tabAt s).snd.snd = Tableau.lrep lprPathIn tab

To get the companion of a LoadedPathRepeat we rewind the path with the lpr value. The succ is there because the lpr values are indices of the history starting with 0, but PathIn.rewind 0 would do nothing.

Equations
Instances For
    def companion {X : Sequent} {tab : Tableau [] X} (s t : PathIn tab) :

    s ♥ t means s is a LoadedPathRepeat and the companionOf s is t.

    Equations
    Instances For
      theorem companion_lt {a✝ : Sequent} {tab : Tableau [] a✝} {l c : PathIn tab} :
      l cc < l
      theorem nodeAt_companionOf_eq_toHistory_get_lpr_val {a✝ : Sequent} {tab : Tableau [] a✝} (s : PathIn tab) (lpr : LoadedPathRepeat (tabAt s).fst (tabAt s).snd.fst) (h : (tabAt s).snd.snd = Tableau.lrep lpr) :
      nodeAt (companionOf s lpr h) = List.get s.toHistory (Fin.cast lpr)

      The node at a companion is the same as the one in the history.

      theorem companion_loaded {a✝ : Sequent} {a✝¹ : Tableau [] a✝} {s t : PathIn a✝¹} :

      Any repeat and companion are both loaded.

      theorem companionOf_length_lt_length {a✝ : Sequent} {tab : Tableau [] a✝} {t : PathIn tab} (lpr : LoadedPathRepeat (tabAt t).fst (tabAt t).snd.fst) (h : (tabAt t).snd.snd = Tableau.lrep lpr) :

      The companion is strictly before the the repeat.

      theorem companion_to_repeat_all_loaded {a✝ : Sequent} {tab : Tableau [] a✝} {l c : PathIn tab} (lpr : LoadedPathRepeat (tabAt l).fst (tabAt l).snd.fst) (tabAt_l_def : (tabAt l).snd.snd = Tableau.lrep lpr) (c_def : c = companionOf l lpr tabAt_l_def) (k : Fin (List.length l.toHistory + 1)) :
      k (↑lpr).succ(nodeAt (l.rewind k)).isLoaded = true

      Not using ♥ here because we need to refer to the lpr.

      theorem not_edge_and_heart {a✝ : Sequent} {tab : Tableau [] a✝} {a b : PathIn tab} :
      ¬(a ⋖_ b b a)
      def cEdge {X : Sequent} {ctX : Tableau [] X} (s t : PathIn ctX) :
      Equations
      Instances For

        ≡ᶜ and Clusters #

        def cEquiv {X : Sequent} {tab : Tableau [] X} (s t : PathIn tab) :

        Nodes are c-equivalent iff there are paths both ways. Note that this is not a closure, so we do not want Relation.EqvGen here.

        Equations
        Instances For
          theorem cEquiv.symm {a✝ : Sequent} {tab : Tableau [] a✝} (s t : PathIn tab) :
          s ≡ᶜ t t ≡ᶜ s

          ≡ᶜ is symmetric.

          def clusterOf {X : Sequent} {tab : Tableau [] X} (p : PathIn tab) :
          Equations
          Instances For
            def before {X : Sequent} {tab : Tableau [] X} (s t : PathIn tab) :

            We have before s t iff there is a path from s to t but not from t to s. This means the cluster of s comes before the cluster of t in tab. NB: The notes use ◃* here but we use ◃⁺. The definitions are equivalent.

            Equations
            Instances For

              s <ᶜ t means there is a ◃-path from s to t but not from t to s. This means t is simpler to deal with first.

              Equations
              Instances For
                theorem before.irrefl {X : Sequent} {tab : Tableau [] X} :

                The <ᶜ relation is irreflexive.

                theorem before.trans {X : Sequent} {tab : Tableau [] X} :

                The <ᶜ relation is transitive.

                The transitive closure of <ᶜ (which in fact is the same as <ᶜ) is irreflexive.

                The before relation in a tableau is well-founded.

                theorem flip_before.irrefl {X : Sequent} {tab : Tableau [] X} :

                The converse of <ᶜ is irreflexive.

                The transtive closure of the converse of <ᶜ is irreflexive.

                The before relation in a tableau is converse well-founded.

                ≣ᶜ is an equivalence relation and <ᶜ is well-founded and converse well-founded. The converse well-founded is what we really need for induction proofs.

                theorem ePropB.a {X : Sequent} {tab : Tableau [] X} (s t : PathIn tab) :
                s ⋖_ ts <ᶜ t t ≡ᶜ s
                theorem ePropB.b {X : Sequent} {tab : Tableau [] X} (s t : PathIn tab) :
                s tt ≡ᶜ s
                theorem c_claim {a : Sequent} {tab : Tableau [] a} (t l c : PathIn tab) :
                (nodeAt t).isFree = truet < ll ct < c
                theorem ePropB.c {X : Sequent} {tab : Tableau [] X} (s t : PathIn tab) :
                (nodeAt s).isFree = trues < ts <ᶜ t
                theorem not_cEquiv_of_free_loaded {a✝ : Sequent} {tab : Tableau [] a✝} (s t : PathIn tab) (s_free : (nodeAt s).isFree = true) (t_loaded : (nodeAt t).isLoaded = true) :
                theorem ePropB.d {X : Sequent} {tab : Tableau [] X} (s t : PathIn tab) :
                (nodeAt t).isFree = trues < ts <ᶜ t
                theorem ePropB.c_single {X : Sequent} {tab : Tableau [] X} (s t : PathIn tab) :
                (nodeAt s).isFree = trues ⋖_ ts <ᶜ t
                theorem ePropB.e {X : Sequent} {tab : Tableau [] X} (s t : PathIn tab) :
                (nodeAt s).isLoaded = true(nodeAt t).isFree = trues ⋖_ ts <ᶜ t
                theorem ePropB.e_help {X : Sequent} {tab : Tableau [] X} (s t : PathIn tab) :
                (nodeAt t).isLoaded = true(nodeAt s).isFree = truet ◃⁺ s¬s ◃⁺ t
                theorem ePropB.f {X : Sequent} {tab : Tableau [] X} (s u t : PathIn tab) :
                s <ᶜ uu <ᶜ ts <ᶜ t

                <ᶜ is transitive

                theorem ePropB.g {X : Sequent} {tab : Tableau [] X} (s t : PathIn tab) :
                t ◃⁺ s¬t ≡ᶜ st <ᶜ s
                theorem ePropB.g_tweak {X : Sequent} {tab : Tableau [] X} (s u t : PathIn tab) :
                s ◃⁺ uu ◃⁺ t¬t ≡ᶜ u¬t ≡ᶜ s
                theorem ePropB.h {X : Sequent} {tab : Tableau [] X} (s t : PathIn tab) :
                s <ᶜ t¬s ≡ᶜ t
                theorem ePropB.i {X : Sequent} {tab : Tableau [] X} (s u t : PathIn tab) :
                s <ᶜ us ≡ᶜ tt <ᶜ u

                Previously called simpler_equiv_simpler.

                theorem ePropB {X : Sequent} {tab : Tableau [] X} (s u t : PathIn tab) :
                (s ⋖_ ts <ᶜ t t ≡ᶜ s) (s tt ≡ᶜ s) ((nodeAt s).isFree = trues < ts <ᶜ t) ((nodeAt t).isFree = trues < ts <ᶜ t) ((nodeAt s).isLoaded = true(nodeAt t).isFree = trues ⋖_ ts <ᶜ t) (s <ᶜ uu <ᶜ ts <ᶜ t) (t ◃⁺ s¬t ≡ᶜ st <ᶜ s) (s <ᶜ t¬s ≡ᶜ t) (s <ᶜ us ≡ᶜ tt <ᶜ u)

                Soundness #

                Specific case of loadedDiamondPaths for Tableau.pdl.

                theorem loadedDiamondPathsPDL (α : Program) (X : Sequent) (tab : Tableau [] X) (t : PathIn tab) {W : Type} {M : KripkeModel W} {v w : W} (v_t : (M, v)nodeAt t) (ξ : AnyFormula) {side : Side} (negLoad_in : (~''(AnyFormula.loaded (αξ))).in_side side (nodeAt t)) (v_α_w : relate M α v w) (w_nξ : (M, w)~''ξ) {Hist : History} {Z Y : Sequent} (bas : Z.basic) (r : PdlRule Z Y) (nrep : ¬rep Hist Z) (next : Tableau (Z :: Hist) Y) (tabAt_t_def : tabAt t = Hist, Z, Tableau.pdl nrep bas r next) :
                ∃ (s : PathIn tab), t ◃⁺ s (HasSat.satisfiable (nodeAt s) ¬s ≡ᶜ t (~''ξ).in_side side (nodeAt s) (M, w)nodeAt s ((nodeAt s).without (~''ξ)).isFree = true)
                theorem SemImply_loadedNormal_ofSeqAndNormal {W✝ : Type} {w : W✝} {φ : Formula} {αs : List Program} {M : KripkeModel W✝} {u : W✝} (w_nφ : (M, w)(~φ)) (u_αs_w : relateSeq M αs u w) :
                theorem firstBox_isAtomic_of_basic {β : Program} {βs : List Program} {φ : Formula} {side : Side} {Y : Sequent} (Y_bas : Y.basic) (anf_in_Y : (~''(AnyFormula.loadBoxes (β :: βs) (AnyFormula.normal φ))).in_side side Y) :
                @[irreducible]
                theorem loadedDiamondPaths (α : Program) (αs : List Program) {X : Sequent} (tab : Tableau [] X) (root_free : X.isFree = true) (t : PathIn tab) {W : Type} {M : KripkeModel W} {v w : W} (v_t : (M, v)nodeAt t) (φ : Formula) {side : Side} (negLoad_in : (~''(AnyFormula.loaded (αAnyFormula.loadBoxes αs (AnyFormula.normal φ)))).in_side side (nodeAt t)) (v_α_αs_w : relateSeq M (α :: αs) v w) (w_nφ : (M, w)(~φ)) :

                Key helper lemma to show the soundness of loading and repeats. Intutively, it says that a tableau starting with a loaded diamond can immitate all possible ways in which a Kripke model can satisfy that diamond.

                The lemma statement differs slightly from the paper version:

                • Our paths cannot stop "inside" a LocalTableau and they may take apart more than one loaded box, hence we need access to all of the boxes αs in front of the normal formula φ.
                • We do not say that the from t to s has to be satisfiable.
                • We only demand s to be satisfiable in the free case. For the other disjunct this is implied.

                The paper proof uses three nested induction levels, one of them only in the star case. Instead of that here we use recursive calls and show that they terminate via the lexicographic order on the ℕ∞ × Nat × Nat triple ⟨distance_list M v w (α :: αs), lengthOfProgram α, t.length⟩. The star case is then actually handled just like the other connectives.

                theorem tableauThenNotSat {Root : Sequent} (tab : Tableau [] Root) (Root_isFree : Root.isFree = true) (t : PathIn tab) :

                Any node in a closed tableau with a free root is not satisfiable. This is the main argument for soundness.

                theorem soundness (φ : Formula) :

                All provable formulas are semantic tautologies. See tableauThenNotSat for what the notes call soundness.