The Tableau Game (Section 6.2 and 6.3) #
Prover and Builder positions #
Equations
- termProver = Lean.ParserDescr.node `termProver 1024 (Lean.ParserDescr.symbol "Prover")
Instances For
Equations
- termBuilder = Lean.ParserDescr.node `termBuilder 1024 (Lean.ParserDescr.symbol "Builder")
Instances For
Equations
- instDecidableEqProverPos.decEq (ProverPos.nlpRep a) (ProverPos.nlpRep b) = ⋯ ▸ isTrue ⋯
- instDecidableEqProverPos.decEq (ProverPos.nlpRep a) (ProverPos.bas a_1 a_2) = isFalse ⋯
- instDecidableEqProverPos.decEq (ProverPos.nlpRep a) (ProverPos.nbas a_1 a_2) = isFalse ⋯
- instDecidableEqProverPos.decEq (ProverPos.bas a a_1) (ProverPos.nlpRep a_2) = isFalse ⋯
- instDecidableEqProverPos.decEq (ProverPos.bas a a_1) (ProverPos.bas b b_1) = ⋯ ▸ have h := ⋯; h ▸ isTrue ⋯
- instDecidableEqProverPos.decEq (ProverPos.bas a a_1) (ProverPos.nbas a_2 a_3) = isFalse ⋯
- instDecidableEqProverPos.decEq (ProverPos.nbas a a_1) (ProverPos.nlpRep a_2) = isFalse ⋯
- instDecidableEqProverPos.decEq (ProverPos.nbas a a_1) (ProverPos.bas a_2 a_3) = isFalse ⋯
- instDecidableEqProverPos.decEq (ProverPos.nbas a a_1) (ProverPos.nbas b b_1) = ⋯ ▸ have h := ⋯; h ▸ isTrue ⋯
Instances For
- lpr {H : History} {X : Sequent} : LoadedPathRepeat H X → BuilderPos H X
- ltab {H : History} {X : Sequent} : ¬rep H X → ¬X.basic → LocalTableau X → BuilderPos H X
Instances For
Equations
- instDecidableEqBuilderPos.decEq (BuilderPos.lpr a) (BuilderPos.lpr b) = if h : a = b then h ▸ isTrue ⋯ else isFalse ⋯
- instDecidableEqBuilderPos.decEq (BuilderPos.lpr a) (BuilderPos.ltab a_1 a_2 a_3) = isFalse ⋯
- instDecidableEqBuilderPos.decEq (BuilderPos.ltab a a_1 a_2) (BuilderPos.lpr a_3) = isFalse ⋯
- instDecidableEqBuilderPos.decEq (BuilderPos.ltab a a_1 a_2) (BuilderPos.ltab b b_1 b_2) = ⋯ ▸ have h := ⋯; h ▸ if h : a_2 = b_2 then h ▸ isTrue ⋯ else isFalse ⋯
Instances For
Equations
Moves #
The moves for the tableauGame
.
Equations
- One or more equations did not get rendered due to their size.
- theMoves ⟨H, ⟨X, Sum.inl (ProverPos.nlpRep a)⟩⟩ = ∅
- theMoves ⟨H, ⟨(L, R, some (Sum.inl (~'⌊α;'β⌋χ))), Sum.inl (ProverPos.bas a_2 Xbasic_2)⟩⟩ = ⋯.elim
- theMoves ⟨H, ⟨(L, R, some (Sum.inl (~'⌊?'τ⌋χ))), Sum.inl (ProverPos.bas a_2 Xbasic_2)⟩⟩ = ⋯.elim
- theMoves ⟨H, ⟨(L, R, some (Sum.inl (~'⌊α⋓β⌋χ))), Sum.inl (ProverPos.bas a_2 Xbasic_2)⟩⟩ = ⋯.elim
- theMoves ⟨H, ⟨(L, R, some (Sum.inl (~'⌊∗α⌋χ))), Sum.inl (ProverPos.bas a_2 Xbasic_2)⟩⟩ = ⋯.elim
- theMoves ⟨H, ⟨(L, R, some (Sum.inr (~'⌊α;'β⌋χ))), Sum.inl (ProverPos.bas a_2 Xbasic_2)⟩⟩ = ⋯.elim
- theMoves ⟨H, ⟨(L, R, some (Sum.inr (~'⌊?'τ⌋χ))), Sum.inl (ProverPos.bas a_2 Xbasic_2)⟩⟩ = ⋯.elim
- theMoves ⟨H, ⟨(L, R, some (Sum.inr (~'⌊α⋓β⌋χ))), Sum.inl (ProverPos.bas a_2 Xbasic_2)⟩⟩ = ⋯.elim
- theMoves ⟨H, ⟨(L, R, some (Sum.inr (~'⌊∗α⌋χ))), Sum.inl (ProverPos.bas a_2 Xbasic_2)⟩⟩ = ⋯.elim
- theMoves ⟨H, ⟨X, Sum.inl (ProverPos.nbas nrep nbas)⟩⟩ = Finset.image (fun (ltab : LocalTableau X) => ⟨H, ⟨X, Sum.inr (BuilderPos.ltab nrep nbas ltab)⟩⟩) Fintype.elems
- theMoves ⟨H, ⟨X, Sum.inr (BuilderPos.lpr lpr)⟩⟩ = ∅
- theMoves ⟨H, ⟨X, Sum.inr (BuilderPos.ltab a a_1 ltab)⟩⟩ = (List.map (fun (Y : Sequent) => ⟨X :: H, ⟨Y, posOf (X :: H) Y⟩⟩) (endNodesOf ltab)).toFinset
Instances For
Termination via finite FL closure #
Intuitively, we want to say that each step from (L,R,O) in a tableau to (L',R',O') stays in the
FL of (L,R,O). Moreover, each side left/right stays within its own FL closure.
This does not mean that L'
must be in the FL of L
, because the O
may also contribute to
the left part. This makes Sequent.subseteq_FL
tricky to define.
Moreover, we are working with lists (or, by ignoring their order, multisets) and thus staying in
the FL closure does not imply that there are only finitely many sequents reachable: by repeating
the same formulas the length of the list may increase.
To tackle this we want to use that rep
is defined with setEqTo
that ignores multiplicity, so
that even if there are infinitely many different lists and thus sequents in principle reachable,
we still cannot have an infinite chain because that would mean we must have a "set-repeat" that
is not allowed.
X
is a component-wise multisubset of the FL-closure of Y
.
Implies Sequent.subseteq_FL
but not vice versa, as infinitely many multisets yield the same set.
BROKEN - does not take into account X.O and Y.O on both sides.
Hopefully we will never need this anyway. Use Sequent.subseteq_FL
instead.
Instances For
Sequent Y
is a component-wise subset of the FL-closure of X
.
Note that by component we mean left and right (and not L, R, O).
WORRY: Is using Sequent.O.L here a problem because it might not be injective?
(Because it calls unload
where both ⌊a⌋⌊b⌋p and ⌊a⌋⌈b⌉p become ⌈a⌉⌈b⌉p.)
Equations
Instances For
Helper for LocalRule.stays_in_FL
A list of sequents that are all FL-subsequents of the given sequent.
The list defined here is not complete because there are infinitely many such other sequents.
But the list is exhaustive modulo setEqTo
, as will be shown later via the Seqt
quotient.
Defined using List.instMonad
.
Equations
- One or more equations did not get rendered due to their size.
Instances For
NOTE
The following do NOT hold / do NOT exist because there are in fact infinitely many FL-subsequents
of a given sequent, so the list returned by all_subseteq_FL
can never contain all.
def Sequent.all_subseteq_FL_spec (X Y : Sequent) (h : Y.subseteq_FL X) :
⟨Y,h⟩ ∈ Sequent.all_subseteq_FL X := sorry
instance Sequent.subseteq_FL_fintype {X : Sequent} :
Fintype { Y // Sequent.subseteq_FL Y X } := sorry
Hence, we now define the Quotient modulo Sequent.setEqTo
within which there are only finitely
many FL-subsequents.
TODO move Seqt
to Sequent.lean and Sequent.subseteq_FL_congr
to FischerLadner.lean later?
Equations
- instSetoidSequent = { r := Sequent.setEqTo, iseqv := instEquivalenceSequentSetEqTo }
Needed to make List.toFinset
work for List Seqt
.
Strange that this is not inferred from instDecidableRelSequentSetEqTo
automatically.
Equations
Congruence for Sequent.subseteq_FL
, used to make Seqt.subseteq_FL
well-defined.
Equations
Instances For
In the quotient the moves keep us inside the FL. UNUSED, delete this?
Equations
- X.allSeqt_subseteq_FL = (List.map (fun (x : { X_1 : Sequent // X_1.subseteq_FL X }) => ⟦↑x⟧) X.all_subseteq_FL).toFinset
Instances For
Equations
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- ⋯ = ⋯
Instances For
Equations
- Seqt.subseteq_FL_instFintype = { elems := Xs.all_subseteq_FL_attached, complete := ⋯ }
In the quotient for setEqTo
there are only finitely many FL-subsets for a given Seqt.
This means "there are only finitely many "sequents modulo setEq
" that are subseteq_FL Y.
General helper lemma: If we have an enumeration of infinitely many values, and all of them have a certain property, but we also know that there are only finitely many values with that property, then there must be identical values in the enuemration.
Lemma 6.10, sort of. Because the move relation is wellfounded, all matches must be finite. Note that the paper does not prove this, only says it is similar to the proof that PDL-tableaux are finite, i.e. Lemma 4.10 which uses the Fischer-Ladner closure.
Actual Game Definition #
The game defined in Section 6.2.
Equations
- One or more equations did not get rendered due to their size.
Instances For
From Prover winning strategies to tableau #
After history Hist
, if Prover has a winning strategy then there is a closed tableau.
Note: we skip Definition 6.9 (Strategy Tree for Prover) and just use the Strategy
type.
This is the induction loading for gameP
.