Loaded Clusters (start of Section 9) #
Note that we skip much of Subsection 8.2 because we worked already with split tableaux anyway.
This file covers Definitions 9.6 to 9.13 and Lemma 9.14. What comes after it is in
separate files: Pdl.Interpolation.QFormula has Definitions 9.15 and 9.16 and Fact 9.17,
Pdl.PreInterpolant has Definition 9.18, and Pdl.ClusterInterpolation has Lemma 9.3,
i.e. the interpolant for the root of a proper cluster. Counterexamples to Lemma 9.12 (c)
and (d) as stated in the paper are in Pdl.ClusterCorrection.
Collecting Cluster Nodes in a Finset #
We define the finite sets loadedBelow and loadedAbove of nodes that are reachable from /
can reach a given node via ◃ by filtering allPaths: a tableau has only finitely many
nodes and PathIn.elem_allPaths says that allPaths tab contains all of them, so we can
simply keep those nodes that are ◃-related to p in the desired direction.
Then clusterListOf_spec is immediate.
The set of all other nodes in the same cluster, essentially a constructive version of
clusterOf. Computed as the intersection of loadedAbove and loadedBelow.
Equations
- clusterListOf p = loadedBelow p ∩ loadedAbove p
Instances For
Cluster roots #
Being a cluster root: there is no ◃ path from s back to a parent of s.
As a parent p of s always has a ◃ path to s, this says that no parent of s is
≡ᶜ to s (see PathIn.isClusterRoot_iff), i.e. that s is the first node of its own
cluster along the branch leading to s.
Note that this is vacuously true for .nil, the root of the whole tableau, which has no
parent at all. This is why we quantify over all parents instead of demanding that a parent
exists: the root of a tableau may already be loaded.
Instances For
The root of the whole tableau is a cluster root, because it has no parent.
Equivalent formulation of PathIn.isClusterRoot using ≡ᶜ.
If the parent of t is free, then t is a cluster root.
This is the case for all children of free nodes in the recursion of tabToIntAt.
If all parents of s are free — which for a loaded s says exactly that s is the
first loaded node along the branch leading to it — then s is a cluster root.
Def 8.14: e is an exit of the cluster of s, i.e. e ∈ C⁺ \ C where C is the
cluster of s: it is not in the cluster of s, but it is a child of a node in it.
Instances For
Exits of a cluster are cluster roots.
This is one of the two things needed to keep the tabToIntAt recursion going.
Lemma 8.15 (a): clusters are subtrees. Here in the form we need it: the root of a
cluster is ≤ all nodes of its cluster.
Exits of the cluster of a cluster root s are proper descendants of s.
This is the second thing needed to keep the tabToIntAt recursion going, and it needs
that clusters are subtrees, i.e. Lemma 8.15 (a).
Loaded Clusters #
A cluster, starting at a right-loaded root which is not ≡ᶜ to any parent of it.
Note that there is no explicit parent field: the root of the whole tableau may itself be
loaded and then has no parent. Instead, root_not_to_parent quantifies over all parents of
the root — which is exactly the property PathIn.isClusterRoot that tabToIntAt maintains
as an invariant.
- root : PathIn tab
The root of the cluster.
- root_not_to_parent : self.root.isClusterRoot
There is no ◃ path from the root to any parent of it (so the root is indeed the root).
There is ◃ path from the root to itself (so we have a proper cluster).
The root is loaded on the right.
The set of all paths in the cluster.
The root is in the cluster.
All elements of
CLare ≡ᶜ and thus can reach each other.The root can reach all nodes of the cluster.
Instances For
Make the LoadedCluster of a right-loaded node that is the first node of its cluster.
This is the way tabToIntAt now gets hold of a LoadedCluster.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The exits of the cluster, i.e. C⁺ \ C from Def 8.14.
Equations
- C.exits = {e ∈ C.CL.biUnion fun (t : PathIn tab) => Finset.image Subtype.val t.children | e ∉ C.CL}
Instances For
Lemma 9.4 (b): the left component of a node in the cluster is empty iff the left
component of the root of the cluster is empty. Note that here the left component is the
free side, because a LoadedCluster is loaded on the right.
As Sequent.left ⟨L,R,O⟩ = L ∪ O.L and O.L = ∅ for the nodes in the cluster by
LoadedCluster.all_right_loaded, this is the same as Λ₁(t) = ∅ ↔ Λ₁(r) = ∅.
Part of Lemma 9.4 (c): If t is not an lpr, then at least one child is in C.
This needs that the cluster is proper, i.e. that its root lies on a ◃-cycle.
Def 9.6: All nodes in cluster with a certain set of formulas on the right.
TODO: .right might not get or not keep track of the loaded formula!
Better use Finset WhateverFormula and Sequent.wForms here maybe?
Instances For
The cluster at the fine level #
The CL field of a LoadedCluster only contains the nodes in the coarse PathIn sense.
For Definition 9.8 we also need the intermediate nodes inside the local tableaux, so we
now determine which fine nodes belong to the cluster.
An intermediate node v inside the local tableau at a node p of the cluster belongs to
the cluster iff some child of p below v is again in the cluster: in that case v lies
on a ◃ cycle. Note that the children of p are exactly the nodes p.append (loc Y_in nil)
for the end nodes Y of the local tableau at p, and they are labelled with Y.
A fine node belongs to the cluster C iff its base node is in C and either it is
that base node, or one of the children of the base node below it is in C.
Equations
Instances For
Equations
All fine nodes in the cluster C.
Equations
- C.fineCL = List.filter (fun (f : FinePathIn tab) => decide (C.memFine f)) (allFinePaths tab)
Instances For
If a fine node of the cluster has a coarse child of the cluster below it, then it has a fine child in the cluster.
Lemma 9.7 (c) at the fine level, for nodes that are not coarse nodes: if a fine node
f inside a local tableau belongs to the cluster, then so does one of its children.
Lemma 9.7 (c) at the fine level, in general: any fine node of the cluster that is not
a loaded-path repeat has a child in the cluster. For coarse nodes this uses Lemma 9.4 (c),
i.e. nonLpr_some_child_in_C, and hence needs that the cluster is proper.
All fine nodes just outside the cluster C, i.e. C⁺ \ C at the fine level.
Equations
Instances For
The fine version of C⁺.
Instances For
Λ₂[C], the right components of the fine nodes of the cluster.
Equations
- C.lambdaTwo = Finset.image (fun (f : FinePathIn tab) => f.label.rightOnly) C.fineCL.toFinset
Instances For
Λ₂[C⁺], the right components of the fine nodes of the cluster and of its exits.
Equations
- C.lambdaTwoPlus = Finset.image (fun (f : FinePathIn tab) => f.label.rightOnly) C.fineCLplus
Instances For
C_Δ from Def 9.6, at the fine level.
Equations
- C.nodesWithFine Δ = List.filter (fun (f : FinePathIn tab) => decide (f.label.rightOnly = Δ)) C.fineCL
Instances For
C⁺_Δ from Def 9.6, at the fine level.
Equations
- C.plusNodesWithFine Δ = {f ∈ C.fineCLplus | decide (f.label.rightOnly = Δ) = true}
Instances For
C^R_Δ from Def 9.6: nodes with right component Δ where a right rule is applied.
Equations
- C.nodesWithFineRight Δ = List.filter (fun (f : FinePathIn tab) => f.usesRightRule) (C.nodesWithFine Δ)
Instances For
C^L_Δ from Def 9.6: nodes with right component Δ where a left rule is applied.
Equations
- C.nodesWithFineLeft Δ = List.filter (fun (f : FinePathIn tab) => f.usesLeftRule) (C.nodesWithFine Δ)
Instances For
Nodes with right component Δ where no rule is applied at all. These are the
loaded-path repeats and the closing rules, which Lemma 9.7 (a) in the paper does not
mention.
Equations
- C.nodesWithFineNoRule Δ = List.filter (fun (f : FinePathIn tab) => !f.usesLeftRule && !f.usesRightRule) (C.nodesWithFine Δ)
Instances For
Lemma 9.7 (a), first part: C_Δ is the union of C^L_Δ and C^R_Δ and the nodes
where no rule is applied.
Lemma 9.7 (a), second part: C^L_Δ and C^R_Δ are disjoint.
Δ ∈ Λ₂[C] iff C_Δ ≠ ∅, the remark after the invariant in Def 9.8.
The right components of the children of a node in C^R_Δ.
For the quasi-tableau in Def 9.8 we need, given Δ ∈ Λ₂[C], the sequents Π₁, …, Πₙ
obtained by applying the right rule to Δ — both for local rules (Lemma 9.7 (f)) and for
the modal rule when Δ is basic (Lemma 9.7 (e)). Instead of using uniformity to choose
such a rule we here simply look up the first node of C^R_Δ and read off the right
components of its children. By uniformity (which we do not prove here) this does not
depend on the chosen node. When C^R_Δ is empty — which by Lemma 9.7 (d) only happens
when C_Δ is empty, i.e. when Δ ∉ Λ₂[C] — we return the empty list, but note that the
construction of Q below never uses stepOf in that case.
Equations
- C.stepOf Δ = match (C.nodesWithFineRight Δ).head? with | some f => Finset.image (fun (g : FinePathIn tab) => g.label.rightOnly) f.children | none => ∅
Instances For
If some right rule is applied at a node of the cluster with right component Δ, then
stepOf Δ is non-empty: by Lemma 9.7 (c) that node has a child in the cluster, so the rule
applied there cannot be a closing rule.
Equations
- C.stepOfL = Finset.seqSort ∘ C.stepOf
Instances For
Uniformity #
stepOf reads off the children of the first node of C^R_Δ. Using head? is a legitimate
way to implement the "unique local rule R₂ with principal formula ξ" of Lemma 9.7 (f)
without making a choice, and it is harmless as long as all nodes of C^R_Δ agree on the
right components of their children — which is exactly what uniformity of the tableau
(conditions U1 and U2 in the paper) is for. Without uniformity nothing relates stepOf Δ to
the nodes of C^R_Δ other than the arbitrarily chosen first one, and the correctness proofs
of the pre-interpolants do need the relation for every node of the region R_x = C^R_Δ.
Two remarks. First, uniformity is only needed when Δ is not basic: when Δ is basic, the
rule applied at a node of C^R_Δ is the modal rule applied to the unique loaded formula of
Δ (Lemma 9.7 (e)), so the right components of the children are determined by Δ alone.
Second, stepOf produces an ordered list, so what is needed is agreement of the children
lists including their order; since the right components of the children of a node in
C^R_Δ are determined by Δ together with the rule and its principal formula, this follows
from uniformity in the form of Lemma 9.7 (f).
Uniformity is not available in this development yet, so for now we state the property that
is needed as an explicit assumption, and stepOf_spec shows that it suffices to justify the
use of head?.
The consequence of uniformity that the quasi-tableau construction needs: 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, in the same order. Compare Lemma 9.7 (f).
Equations
- One or more equations did not get rendered due to their size.
Instances For
Given HasUniformSteps, the list stepOf Δ really describes the right components of
the children of every node in C^R_Δ, and not just of the first one.
A child of a fine node of the cluster is a fine node of C⁺.
The right component of a fine node of C⁺ is in Λ₂[C⁺].
Λ₂[C] ⊆ Λ₂[C⁺].
The labels given by stepOf are in Λ₂[C⁺]. This is the invariant needed in Def 9.8:
a node of Q is labelled with an element of Λ₂[C⁺], and it is a leaf exactly when it is
a repeat or its label is not in Λ₂[C], i.e. when it is an exit.
Interpolants for the exit regions (Def 9.13 and Lemma 9.14) #
By the assumption of Lemma 9.3 we have an interpolant θ_t for every exit node
t ∈ C⁺ \ C. Here these are given by a map θ on the fine nodes; the assumption that
they are interpolants is ∀ f ∈ C.fineExits, isPartInterpolant f.label (θ f).
C⁺_Δ \ C_Δ, i.e. the exit nodes whose right component is Δ.
Instances For
Def 9.13: θ_Δ, the disjunction of the interpolants of all exit nodes whose right
component is Δ. Note that θ_Δ = ⊥ in case there are no such exit nodes.
Equations
- C.thetaOf θ Δ = (Finset.image θ (C.exitsWithFine Δ)).dis
Instances For
Membership in C⁺_Δ \ C_Δ means: being an exit node with right component Δ.
The right component of an exit node with right component Δ is the right component
of Δ.
Lemma 9.14 (a): Λ₁(t) ⊨ θ_Δ for all t ∈ C⁺_Δ \ C_Δ.
Lemma 9.14 (b): Δ ⊨ ¬θ_Δ.
Lemma 9.14 (c): the vocabulary of θ_Δ is included in the vocabulary of Δ and in the
union of the vocabularies of the left components of the exit nodes with right component
Δ.