Documentation

DescriptiveComplexity.Exponential.Peel

Peeling a quantifier into a block #

The semantic core of the translation lemma. Two facts, both independent of any syntax.

A guarded block is a point. A second-order quantifier ranges over all assignments of DescriptiveComplexity.ExpExpansion.pointBlock; the quantifier being translated ranges over the points of the expanded universe, which are the assignments the point guard admits. The two match up (DescriptiveComplexity.ExpExpansion.exists_point_iff, DescriptiveComplexity.ExpExpansion.forall_point_iff): a guarded block is a point, existentially with the guard as a conjunct and universally with the guard as a hypothesis, which is the usual shape of relativized quantification.

A guard can be pulled through the rest of the prefix. The guard of round i sits at nesting depth i in the kernel, so peeling round i first has to move it out past the quantifiers that remain (DescriptiveComplexity.altBlockQuant_and_const, DescriptiveComplexity.altBlockQuant_const_imp). Both directions need the block assignments to be inhabited, which they are – DescriptiveComplexity.SOBlock.botAssign – and the existential case of the implication needs excluded middle, as relativized quantification always does.

Moving a constant through the prefix #

theorem DescriptiveComplexity.altBlockQuant_and_const {B : SOBlock} {A : Type} (g : Prop) (k : ℕ) (P : (Fin k → B.Assignment A) → Prop) (pol : Bool) :
altBlockQuant A B k (fun (ρs : Fin k → B.Assignment A) => g ∧ P ρs) pol ↔ g ∧ altBlockQuant A B k P pol

A conjunct not depending on the rounds moves out of the prefix.

Dependency graph
theorem DescriptiveComplexity.altBlockQuant_const_imp {B : SOBlock} {A : Type} (g : Prop) (k : ℕ) (P : (Fin k → B.Assignment A) → Prop) (pol : Bool) :
altBlockQuant A B k (fun (ρs : Fin k → B.Assignment A) => g → P ρs) pol ↔ g → altBlockQuant A B k P pol

A hypothesis not depending on the rounds moves out of the prefix. The existential case is where excluded middle enters: with the hypothesis false, any round will do, and there is one.

Dependency graph

A guarded block is a point #

Dependency graph
@[simp]
theorem DescriptiveComplexity.ExpExpansion.roundAssign_apply {L : FirstOrder.Language} {X : ExpExpansion L} {m : ℕ} {A : Type} [L.Structure A] [LinearOrder A] [Finite A] [Nonempty A] (pts : Fin m → X.Map A) (i : Fin m) :
roundAssign pts i = pointAssign (pts i)
Dependency graph
Dependency graph

A guarded block is a point, existentially.

Dependency graph

A guarded block is a point, universally.

Dependency graph

The peel steps #

Peeling the outermost quantifier of the prefix: the guard of the leading round moves out past the rounds that remain (DescriptiveComplexity.altBlockQuant_and_const, DescriptiveComplexity.altBlockQuant_const_imp), and what is left of it turns the round into a point (exists_point_iff, forall_point_iff).