Classical.CutElim: completeness and cut elimination for CLL
Γ ⊢ Δ ──soundness──▶ Γ ⊨ Δ ──completeness──▶ Γ ⊢cf Δ
The syntactic phase space
- a phase is a pair (Γ, Δ) of lists of formulas, taken up to permutation on each side. Read it as the sequent fragment "Γ on the left, Δ on the right";
- · concatenates both sides, and ε is ([], []);
- the pole is { (Γ, Δ) | Γ ⊢cf Δ };
- the reusable phases are the pairs (‼Σ, ⁇Π). They are exactly the contexts allowed around a promotion, and the structural rules for ! and ? let them be discarded and duplicated.
What changes compared with ILL
y ∈ X^⊥ iff for every x ∈ X, x.1 ++ y.1 ⊢cf x.2 ++ y.2
z ∈ X^⊥⊥ iff z passes every test y that all members of X pass
Okada's lemma
hyp A ∈ ⟦A⟧ and concl A ∈ ⟦A⟧^⊥
A two-sided context: hypotheses and conclusions.
Definition ctx : Type := list cformula * list cformula.
Two contexts are equivalent when both sides are permutations. We
give this relation explicitly. stdpp also has generic Equiv
instances for pairs and lists, but they are not the ones we want, so
every lemma below types its phases as elements of syntactic.
Definition ctx_equiv : Equiv ctx := λ x y, x.1 ≡ₚ y.1 ∧ x.2 ≡ₚ y.2.
Concatenation on both sides.
Definition ctx_app (x y : ctx) : ctx := (x.1 ++ y.1, x.2 ++ y.2).Equivalence ctx_equivEquivalence ctx_equivEquivalence (λ x y : ctx, x.1 ≡ₚ y.1 ∧ x.2 ≡ₚ y.2)Reflexive (λ x y : ctx, x.1 ≡ₚ y.1 ∧ x.2 ≡ₚ y.2)Symmetric (λ x y : ctx, x.1 ≡ₚ y.1 ∧ x.2 ≡ₚ y.2)Transitive (λ x y : ctx, x.1 ≡ₚ y.1 ∧ x.2 ≡ₚ y.2)done.Reflexive (λ x y : ctx, x.1 ≡ₚ y.1 ∧ x.2 ≡ₚ y.2)Symmetric (λ x y : ctx, x.1 ≡ₚ y.1 ∧ x.2 ≡ₚ y.2)split; by symmetry.x, y: ctx
H: x.1 ≡ₚ y.1
H0: x.2 ≡ₚ y.2y.1 ≡ₚ x.1 ∧ y.2 ≡ₚ x.2Transitive (λ x y : ctx, x.1 ≡ₚ y.1 ∧ x.2 ≡ₚ y.2)split; by etrans. Qed.x, y, z: ctx
H: x.1 ≡ₚ y.1
H0: x.2 ≡ₚ y.2
H1: y.1 ≡ₚ z.1
H2: y.2 ≡ₚ z.2x.1 ≡ₚ z.1 ∧ x.2 ≡ₚ z.2Proper (ctx_equiv ==> ctx_equiv ==> ctx_equiv) ctx_appProper (ctx_equiv ==> ctx_equiv ==> ctx_equiv) ctx_appsplit; cbn [ctx_app fst snd]; by f_equiv. Qed.x, x': ctx
Hx1: x.1 ≡ₚ x'.1
Hx2: x.2 ≡ₚ x'.2
y, y': ctx
Hy1: y.1 ≡ₚ y'.1
Hy2: y.2 ≡ₚ y'.2ctx_equiv (ctx_app x y) (ctx_app x' y')
The model. The obligations are the monoid laws, closure of the pole
under ≡ (by ex), closure of J under ≡ (a permutation of ‼Σ
is again of the form ‼Σ'), and the two structural laws for J
(by weaken_bangs/weaken_whys and contract_bangs/contract_whys).
cphase_spacecphase_space∀ x x0 x1 : ctx, x.1 ++ x0.1 ++ x1.1 ≡ₚ (x.1 ++ x0.1) ++ x1.1 ∧ x.2 ++ x0.2 ++ x1.2 ≡ₚ (x.2 ++ x0.2) ++ x1.2∀ x x0 : ctx, x.1 ++ x0.1 ≡ₚ x0.1 ++ x.1 ∧ x.2 ++ x0.2 ≡ₚ x0.2 ++ x.2∀ x : ctx, x.1 ≡ₚ x.1 ∧ x.2 ≡ₚ x.2∀ x x0 : ctx, x.1 ≡ₚ x0.1 ∧ x.2 ≡ₚ x0.2 → x.1 ⊢cf x.2 → x0.1 ⊢cf x0.2∀ x x0 : ctx, x.1 ≡ₚ x0.1 ∧ x.2 ≡ₚ x0.2 → (∃ x1 x2 : list cformula, x.1 = ‼x1 ∧ x.2 = ⁇x2) → ∃ x1 x2 : list cformula, x0.1 = ‼x1 ∧ x0.2 = ⁇x2∃ x x0 : list cformula, [] = ‼x ∧ [] = ⁇x0∀ x x0 : ctx, (∃ x1 x2 : list cformula, x.1 = ‼x1 ∧ x.2 = ⁇x2) → (∃ x1 x2 : list cformula, x0.1 = ‼x1 ∧ x0.2 = ⁇x2) → ∃ x1 x2 : list cformula, x.1 ++ x0.1 = ‼x1 ∧ x.2 ++ x0.2 = ⁇x2∀ x x0 : ctx, (∃ x1 x2 : list cformula, x.1 = ‼x1 ∧ x.2 = ⁇x2) → x0.1 ⊢cf x0.2 → x.1 ++ x0.1 ⊢cf x.2 ++ x0.2∀ x x0 : ctx, (∃ x1 x2 : list cformula, x.1 = ‼x1 ∧ x.2 = ⁇x2) → (x.1 ++ x.1) ++ x0.1 ⊢cf (x.2 ++ x.2) ++ x0.2 → x.1 ++ x0.1 ⊢cf x.2 ++ x0.2∀ x x0 x1 : ctx, x.1 ++ x0.1 ++ x1.1 ≡ₚ (x.1 ++ x0.1) ++ x1.1 ∧ x.2 ++ x0.2 ++ x1.2 ≡ₚ (x.2 ++ x0.2) ++ x1.2by rewrite !(assoc_L (++)).x, x0, x1: ctxx.1 ++ x0.1 ++ x1.1 ≡ₚ (x.1 ++ x0.1) ++ x1.1 ∧ x.2 ++ x0.2 ++ x1.2 ≡ₚ (x.2 ++ x0.2) ++ x1.2∀ x x0 : ctx, x.1 ++ x0.1 ≡ₚ x0.1 ++ x.1 ∧ x.2 ++ x0.2 ≡ₚ x0.2 ++ x.2split; apply Permutation_app_comm.x, x0: ctxx.1 ++ x0.1 ≡ₚ x0.1 ++ x.1 ∧ x.2 ++ x0.2 ≡ₚ x0.2 ++ x.2done.∀ x : ctx, x.1 ≡ₚ x.1 ∧ x.2 ≡ₚ x.2∀ x x0 : ctx, x.1 ≡ₚ x0.1 ∧ x.2 ≡ₚ x0.2 → x.1 ⊢cf x.2 → x0.1 ⊢cf x0.2by apply ex.x, y: ctx
H1: x.1 ≡ₚ y.1
H2: x.2 ≡ₚ y.2x.1 ⊢cf x.2 → y.1 ⊢cf y.2∀ x x0 : ctx, x.1 ≡ₚ x0.1 ∧ x.2 ≡ₚ x0.2 → (∃ x1 x2 : list cformula, x.1 = ‼x1 ∧ x.2 = ⁇x2) → ∃ x1 x2 : list cformula, x0.1 = ‼x1 ∧ x0.2 = ⁇x2x, y: ctx
H1: x.1 ≡ₚ y.1
H2: x.2 ≡ₚ y.2
Σ, Π: list cformula
E1: x.1 = ‼Σ
E2: x.2 = ⁇Π∃ x0 x1 : list cformula, y.1 = ‼x0 ∧ y.2 = ⁇x1x, y: ctx
Σ: list cformula
H1: ‼Σ ≡ₚ y.1
H2: x.2 ≡ₚ y.2
Π: list cformula
E1: x.1 = ‼Σ
E2: x.2 = ⁇Π∃ x0 x1 : list cformula, y.1 = ‼x0 ∧ y.2 = ⁇x1x, y: ctx
Σ: list cformula
H1: ‼Σ ≡ₚ y.1
Π: list cformula
H2: ⁇Π ≡ₚ y.2
E1: x.1 = ‼Σ
E2: x.2 = ⁇Π∃ x0 x1 : list cformula, y.1 = ‼x0 ∧ y.2 = ⁇x1x, y: ctx
Σ: list cformula
H1: ‼Σ ≡ₚ y.1
Π: list cformula
H2: ⁇Π ≡ₚ y.2
E1: x.1 = ‼Σ
E2: x.2 = ⁇Π
Σ': list cformula
H: y.1 = ‼Σ'∃ x0 x1 : list cformula, y.1 = ‼x0 ∧ y.2 = ⁇x1by exists Σ', Π'.x, y: ctx
Σ: list cformula
H1: ‼Σ ≡ₚ y.1
Π: list cformula
H2: ⁇Π ≡ₚ y.2
E1: x.1 = ‼Σ
E2: x.2 = ⁇Π
Σ': list cformula
H: y.1 = ‼Σ'
Π': list cformula
H0: y.2 = ⁇Π'∃ x0 x1 : list cformula, y.1 = ‼x0 ∧ y.2 = ⁇x1by exists [], [].∃ x x0 : list cformula, [] = ‼x ∧ [] = ⁇x0∀ x x0 : ctx, (∃ x1 x2 : list cformula, x.1 = ‼x1 ∧ x.2 = ⁇x2) → (∃ x1 x2 : list cformula, x0.1 = ‼x1 ∧ x0.2 = ⁇x2) → ∃ x1 x2 : list cformula, x.1 ++ x0.1 = ‼x1 ∧ x.2 ++ x0.2 = ⁇x2x, y: ctx
Σ, Π, Σ', Π': list cformula∃ x0 x1 : list cformula, ‼Σ ++ ‼Σ' = ‼x0 ∧ ⁇Π ++ ⁇Π' = ⁇x1by rewrite !map_app.x, y: ctx
Σ, Π, Σ', Π': list cformula‼Σ ++ ‼Σ' = ‼(Σ ++ Σ') ∧ ⁇Π ++ ⁇Π' = ⁇(Π ++ Π')∀ x x0 : ctx, (∃ x1 x2 : list cformula, x.1 = ‼x1 ∧ x.2 = ⁇x2) → x0.1 ⊢cf x0.2 → x.1 ++ x0.1 ⊢cf x.2 ++ x0.2by apply weaken_bangs, weaken_whys.j, y: ctx
Σ, Π: list cformula
H: y.1 ⊢cf y.2‼Σ ++ y.1 ⊢cf ⁇Π ++ y.2∀ x x0 : ctx, (∃ x1 x2 : list cformula, x.1 = ‼x1 ∧ x.2 = ⁇x2) → (x.1 ++ x.1) ++ x0.1 ⊢cf (x.2 ++ x.2) ++ x0.2 → x.1 ++ x0.1 ⊢cf x.2 ++ x0.2j, y: ctx
Σ, Π: list cformula
H: (‼Σ ++ ‼Σ) ++ y.1 ⊢cf (⁇Π ++ ⁇Π) ++ y.2‼Σ ++ y.1 ⊢cf ⁇Π ++ y.2by rewrite !(assoc_L (++)). Defined.j, y: ctx
Σ, Π: list cformula
H: (‼Σ ++ ‼Σ) ++ y.1 ⊢cf (⁇Π ++ ⁇Π) ++ y.2‼Σ ++ ‼Σ ++ y.1 ⊢cf ⁇Π ++ ⁇Π ++ y.2
Membership in the syntactic model
x: syntacticx ∈ ⫫ ↔ x.1 ⊢cf x.2exact (elem_of_PropSet (λ x : ctx, x.1 ⊢cf x.2) x). Qed.x: syntacticx ∈ ⫫ ↔ x.1 ⊢cf x.2x: syntacticx ∈ cph_J ↔ ∃ Σ Π : list cformula, x = (‼Σ, ⁇Π)x: syntacticx ∈ cph_J ↔ ∃ Σ Π : list cformula, x = (‼Σ, ⁇Π)x: syntactic(∃ Σ Π : list cformula, x.1 = ‼Σ ∧ x.2 = ⁇Π) ↔ ∃ Σ Π : list cformula, x = (‼Σ, ⁇Π)Γ, Δ: list cformula(∃ Σ Π : list cformula, (Γ, Δ).1 = ‼Σ ∧ (Γ, Δ).2 = ⁇Π) ↔ ∃ Σ Π : list cformula, (Γ, Δ) = (‼Σ, ⁇Π)naive_solver. Qed.Γ, Δ: list cformula(∃ Σ Π : list cformula, Γ = ‼Σ ∧ Δ = ⁇Π) ↔ ∃ Σ Π : list cformula, (Γ, Δ) = (‼Σ, ⁇Π)x: syntacticx ∈ one_set ↔ x = ([], [])x: syntacticx ∈ one_set ↔ x = ([], [])x: syntacticx ≡ cph_e ↔ x = ([], [])Γ, Δ: list cformula(Γ, Δ) ≡ cph_e ↔ (Γ, Δ) = ([], [])Γ, Δ: list cformula(Γ, Δ) ≡ cph_e → (Γ, Δ) = ([], [])Γ, Δ: list cformula(Γ, Δ) = ([], []) → (Γ, Δ) ≡ cph_eΓ, Δ: list cformula(Γ, Δ) ≡ cph_e → (Γ, Δ) = ([], [])by simplify_eq/=.Γ, Δ: list cformula
H1: (Γ, Δ).1 = []
H2: (Γ, Δ).2 = [](Γ, Δ) = ([], [])by intros [= -> ->]. Qed.Γ, Δ: list cformula(Γ, Δ) = ([], []) → (Γ, Δ) ≡ cph_e
y is a counter-bag of X when it completes every member of X to
a cut-free provable sequent.
X: propset syntactic
y: syntacticy ∈ X^⊥ ↔ ∀ x : syntactic, x ∈ X → x.1 ++ y.1 ⊢cf x.2 ++ y.2X: propset syntactic
y: syntacticy ∈ X^⊥ ↔ ∀ x : syntactic, x ∈ X → x.1 ++ y.1 ⊢cf x.2 ++ y.2by setoid_rewrite elem_of_pole_syn. Qed.X: propset syntactic
y: syntactic(∀ x : syntactic, x ∈ X → x · y ∈ ⫫) ↔ ∀ x : syntactic, x ∈ X → x.1 ++ y.1 ⊢cf x.2 ++ y.2X, Y: propset syntactic
x: syntacticx ∈ X ⊙ Y ↔ ∃ a b : syntactic, a ∈ X ∧ b ∈ Y ∧ x.1 ≡ₚ a.1 ++ b.1 ∧ x.2 ≡ₚ a.2 ++ b.2by rewrite elem_of_prod. Qed.X, Y: propset syntactic
x: syntacticx ∈ X ⊙ Y ↔ ∃ a b : syntactic, a ∈ X ∧ b ∈ Y ∧ x.1 ≡ₚ a.1 ++ b.1 ∧ x.2 ≡ₚ a.2 ++ b.2
The counter-bags of {ε} are the provable contexts.
y: syntacticy ∈ one_set^⊥ → y.1 ⊢cf y.2y: syntacticy ∈ one_set^⊥ → y.1 ⊢cf y.2y: syntactic(∀ x : syntactic, x ∈ one_set → x.1 ++ y.1 ⊢cf x.2 ++ y.2) → y.1 ⊢cf y.2y: syntactic
H: ∀ x : syntactic, x ∈ one_set → x.1 ++ y.1 ⊢cf x.2 ++ y.2y.1 ⊢cf y.2done. Qed.y: syntactic
H: ∀ x : syntactic, x ∈ one_set → x.1 ++ y.1 ⊢cf x.2 ++ y.2([], []) = ([], [])
hyp A holds one A as a hypothesis, concl A one A as a conclusion.
Definition hyp (A : cformula) : syntactic := ([A], []). Definition concl (A : cformula) : syntactic := ([], [A]).
Four small lemmas do all the bookkeeping for Okada's lemma. The first
two prove that hyp A or concl A is a counter-bag: check that it
completes each member of X, adding A on the left or the right.
X: propset syntactic
A: cformula(∀ x : syntactic, x ∈ X → A :: x.1 ⊢cf x.2) → hyp A ∈ X^⊥X: propset syntactic
A: cformula(∀ x : syntactic, x ∈ X → A :: x.1 ⊢cf x.2) → hyp A ∈ X^⊥X: propset syntactic
A: cformula
H: ∀ x : syntactic, x ∈ X → A :: x.1 ⊢cf x.2hyp A ∈ X^⊥X: propset syntactic
A: cformula
H: ∀ x : syntactic, x ∈ X → A :: x.1 ⊢cf x.2∀ x : syntactic, x ∈ X → x.1 ++ (hyp A).1 ⊢cf x.2 ++ (hyp A).2X: propset syntactic
A: cformula
H: ∀ x : syntactic, x ∈ X → A :: x.1 ⊢cf x.2
x: syntactic
Hx: x ∈ Xx.1 ++ (hyp A).1 ⊢cf x.2 ++ (hyp A).2X: propset syntactic
A: cformula
H: ∀ x : syntactic, x ∈ X → A :: x.1 ⊢cf x.2
x: syntactic
Hx: x ∈ Xx.1 ++ [A] ⊢cf x.2 ++ []auto. Qed.X: propset syntactic
A: cformula
H: ∀ x : syntactic, x ∈ X → A :: x.1 ⊢cf x.2
x: syntactic
Hx: x ∈ XA :: x.1 ⊢cf x.2X: propset syntactic
A: cformula(∀ x : syntactic, x ∈ X → x.1 ⊢cf A :: x.2) → concl A ∈ X^⊥X: propset syntactic
A: cformula(∀ x : syntactic, x ∈ X → x.1 ⊢cf A :: x.2) → concl A ∈ X^⊥X: propset syntactic
A: cformula
H: ∀ x : syntactic, x ∈ X → x.1 ⊢cf A :: x.2concl A ∈ X^⊥X: propset syntactic
A: cformula
H: ∀ x : syntactic, x ∈ X → x.1 ⊢cf A :: x.2∀ x : syntactic, x ∈ X → x.1 ++ (concl A).1 ⊢cf x.2 ++ (concl A).2X: propset syntactic
A: cformula
H: ∀ x : syntactic, x ∈ X → x.1 ⊢cf A :: x.2
x: syntactic
Hx: x ∈ Xx.1 ++ (concl A).1 ⊢cf x.2 ++ (concl A).2X: propset syntactic
A: cformula
H: ∀ x : syntactic, x ∈ X → x.1 ⊢cf A :: x.2
x: syntactic
Hx: x ∈ Xx.1 ++ [] ⊢cf x.2 ++ [A]auto. Qed.X: propset syntactic
A: cformula
H: ∀ x : syntactic, x ∈ X → x.1 ⊢cf A :: x.2
x: syntactic
Hx: x ∈ Xx.1 ⊢cf A :: x.2
The other two use such facts: they turn membership into a cut-free
proof with A on the left or on the right.
X: propset syntactic
A: cformula
y: syntactichyp A ∈ X → y ∈ X^⊥ → A :: y.1 ⊢cf y.2X: propset syntactic
A: cformula
y: syntactichyp A ∈ X → y ∈ X^⊥ → A :: y.1 ⊢cf y.2X: propset syntactic
A: cformula
y: syntactic
HA: hyp A ∈ X
Hy: y ∈ X^⊥A :: y.1 ⊢cf y.2exact (Hy _ HA). Qed.X: propset syntactic
A: cformula
y: syntactic
HA: hyp A ∈ X
Hy: ∀ x : syntactic, x ∈ X → x.1 ++ y.1 ⊢cf x.2 ++ y.2A :: y.1 ⊢cf y.2X: propset syntactic
A: cformula
x: syntacticconcl A ∈ X^⊥ → x ∈ X → x.1 ⊢cf A :: x.2X: propset syntactic
A: cformula
x: syntacticconcl A ∈ X^⊥ → x ∈ X → x.1 ⊢cf A :: x.2X: propset syntactic
A: cformula
x: syntactic
HA: concl A ∈ X^⊥
Hx: x ∈ Xx.1 ⊢cf A :: x.2X: propset syntactic
A: cformula
x: syntactic
HA: ∀ x : syntactic, x ∈ X → x.1 ++ (concl A).1 ⊢cf x.2 ++ (concl A).2
Hx: x ∈ Xx.1 ⊢cf A :: x.2auto. Qed.X: propset syntactic
A: cformula
x: syntactic
HA: ∀ x : syntactic, x ∈ X → x.1 ++ (concl A).1 ⊢cf x.2 ++ (concl A).2
Hx: x ∈ Xx.1 ++ [] ⊢cf x.2 ++ [A]
A counter-bag of X ⊙ Y completes every product a · b.
X, Y: propset syntactic
a, b, y: syntactica ∈ X → b ∈ Y → y ∈ (X ⊙ Y)^⊥ → (a.1 ++ b.1) ++ y.1 ⊢cf (a.2 ++ b.2) ++ y.2X, Y: propset syntactic
a, b, y: syntactica ∈ X → b ∈ Y → y ∈ (X ⊙ Y)^⊥ → (a.1 ++ b.1) ++ y.1 ⊢cf (a.2 ++ b.2) ++ y.2X, Y: propset syntactic
a, b, y: syntactic
Ha: a ∈ X
Hb: b ∈ Y
Hy: y ∈ (X ⊙ Y)^⊥(a.1 ++ b.1) ++ y.1 ⊢cf (a.2 ++ b.2) ++ y.2X, Y: propset syntactic
a, b, y: syntactic
Ha: a ∈ X
Hb: b ∈ Y
Hy: ∀ x : syntactic, x ∈ X ⊙ Y → x.1 ++ y.1 ⊢cf x.2 ++ y.2(a.1 ++ b.1) ++ y.1 ⊢cf (a.2 ++ b.2) ++ y.2X, Y: propset syntactic
a, b, y: syntactic
Ha: a ∈ X
Hb: b ∈ Y
Hy: ∀ x : syntactic, x ∈ X ⊙ Y → x.1 ++ y.1 ⊢cf x.2 ++ y.2a · b ∈ X ⊙ Yby exists a, b. Qed.X, Y: propset syntactic
a, b, y: syntactic
Ha: a ∈ X
Hb: b ∈ Y
Hy: ∀ x : syntactic, x ∈ X ⊙ Y → x.1 ++ y.1 ⊢cf x.2 ++ y.2∃ a0 b0 : syntactic, a0 ∈ X ∧ b0 ∈ Y ∧ a · b ≡ a0 · b0
Each variable $p denotes the single phase hyp ($p).
Definition syn_val : nat → propset syntactic := λ p, {[ x | x = hyp ($p) ]}.p: nat
x: syntacticx ∈ syn_val p ↔ x = hyp $pp: nat
x: syntacticx ∈ syn_val p ↔ x = hyp $pby rewrite elem_of_PropSet. Qed.p: nat
x: syntacticx ∈ {[ x0 | x0 = hyp $p ]} ↔ x = hyp $p
Okada's lemma
A: cformulahyp A ∈ ⟦A⟧syn_val ∧ concl A ∈ ⟦A⟧syn_val^⊥A: cformulahyp A ∈ ⟦A⟧syn_val ∧ concl A ∈ ⟦A⟧syn_val^⊥p: nathyp $p ∈ (syn_val p^⊥)^⊥p: natconcl $p ∈ ((syn_val p^⊥)^⊥)^⊥A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥hyp (A^⊥) ∈ ⟦A⟧syn_val^⊥A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥concl (A^⊥) ∈ (⟦A⟧syn_val^⊥)^⊥hyp 𝟙 ∈ (one_set^⊥)^⊥concl 𝟙 ∈ ((one_set^⊥)^⊥)^⊥hyp ⊥ ∈ one_set^⊥concl ⊥ ∈ (one_set^⊥)^⊥hyp ⊤ ∈ full_setconcl ⊤ ∈ full_set^⊥hyp 𝟘 ∈ (∅^⊥)^⊥concl 𝟘 ∈ ((∅^⊥)^⊥)^⊥A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥hyp (A ⊗ B) ∈ ((⟦A⟧syn_val ⊙ ⟦B⟧syn_val)^⊥)^⊥A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥concl (A ⊗ B) ∈ (((⟦A⟧syn_val ⊙ ⟦B⟧syn_val)^⊥)^⊥)^⊥A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥hyp (A ⅋ B) ∈ (⟦A⟧syn_val^⊥ ⊙ ⟦B⟧syn_val^⊥)^⊥A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥concl (A ⅋ B) ∈ ((⟦A⟧syn_val^⊥ ⊙ ⟦B⟧syn_val^⊥)^⊥)^⊥A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥hyp (A & B) ∈ ⟦A⟧syn_val ∩ ⟦B⟧syn_valA: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥concl (A & B) ∈ (⟦A⟧syn_val ∩ ⟦B⟧syn_val)^⊥A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥hyp (A ⊕ B) ∈ ((⟦A⟧syn_val ∪ ⟦B⟧syn_val)^⊥)^⊥A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥concl (A ⊕ B) ∈ (((⟦A⟧syn_val ∪ ⟦B⟧syn_val)^⊥)^⊥)^⊥A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥hyp (!A) ∈ ((⟦A⟧syn_val ∩ cph_J)^⊥)^⊥A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥concl (!A) ∈ (((⟦A⟧syn_val ∩ cph_J)^⊥)^⊥)^⊥A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥hyp (? A) ∈ (⟦A⟧syn_val^⊥ ∩ cph_J)^⊥A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥concl (? A) ∈ ((⟦A⟧syn_val^⊥ ∩ cph_J)^⊥)^⊥p: nathyp $p ∈ (syn_val p^⊥)^⊥p: nat∀ x : syntactic, x ∈ syn_val p^⊥ → $p :: x.1 ⊢cf x.2apply (L_use (syn_val p)); [by apply elem_of_syn_val | done].p: nat
y: syntactic
Hy: y ∈ syn_val p^⊥$p :: y.1 ⊢cf y.2p: natconcl $p ∈ ((syn_val p^⊥)^⊥)^⊥p: nat∀ x : syntactic, x ∈ syn_val p → x.1 ⊢cf $p :: x.2apply ax.p: nat(hyp $p).1 ⊢cf $p :: (hyp $p).2A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥hyp (A^⊥) ∈ ⟦A⟧syn_val^⊥A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥∀ x : syntactic, x ∈ ⟦A⟧syn_val → (A^⊥)%cll :: x.1 ⊢cf x.2A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥
x: syntactic
Hx: x ∈ ⟦A⟧syn_val(A^⊥)%cll :: x.1 ⊢cf x.2by apply (R_use (⟦A⟧syn_val)).A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥
x: syntactic
Hx: x ∈ ⟦A⟧syn_valx.1 ⊢cf A :: x.2A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥concl (A^⊥) ∈ (⟦A⟧syn_val^⊥)^⊥A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥∀ x : syntactic, x ∈ ⟦A⟧syn_val^⊥ → x.1 ⊢cf (A^⊥)%cll :: x.2A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥
y: syntactic
Hy: y ∈ ⟦A⟧syn_val^⊥y.1 ⊢cf (A^⊥)%cll :: y.2by apply (L_use (⟦A⟧syn_val)).A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥
y: syntactic
Hy: y ∈ ⟦A⟧syn_val^⊥A :: y.1 ⊢cf y.2hyp 𝟙 ∈ (one_set^⊥)^⊥∀ x : syntactic, x ∈ one_set^⊥ → 𝟙 :: x.1 ⊢cf x.2by apply oneL, orth_one_syn.y: syntactic
Hy: y ∈ one_set^⊥𝟙 :: y.1 ⊢cf y.2concl 𝟙 ∈ ((one_set^⊥)^⊥)^⊥∀ x : syntactic, x ∈ one_set → x.1 ⊢cf 𝟙 :: x.2apply oneR.([], []).1 ⊢cf 𝟙 :: ([], []).2hyp ⊥ ∈ one_set^⊥∀ x : syntactic, x ∈ one_set → ⊥ :: x.1 ⊢cf x.2apply botL.⊥ :: ([], []).1 ⊢cf ([], []).2concl ⊥ ∈ (one_set^⊥)^⊥∀ x : syntactic, x ∈ one_set^⊥ → x.1 ⊢cf ⊥ :: x.2by apply botR, orth_one_syn.y: syntactic
Hy: y ∈ one_set^⊥y.1 ⊢cf ⊥ :: y.2apply elem_of_full.hyp ⊤ ∈ full_setconcl ⊤ ∈ full_set^⊥∀ x : syntactic, x ∈ full_set → x.1 ⊢cf ⊤ :: x.2apply topR.x: syntacticx.1 ⊢cf ⊤ :: x.2hyp 𝟘 ∈ (∅^⊥)^⊥∀ x : syntactic, x ∈ ∅^⊥ → 𝟘 :: x.1 ⊢cf x.2apply zeroL.y: syntactic𝟘 :: y.1 ⊢cf y.2concl 𝟘 ∈ ((∅^⊥)^⊥)^⊥set_solver.∀ x : syntactic, x ∈ ∅ → x.1 ⊢cf 𝟘 :: x.2A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥hyp (A ⊗ B) ∈ ((⟦A⟧syn_val ⊙ ⟦B⟧syn_val)^⊥)^⊥A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥∀ x : syntactic, x ∈ (⟦A⟧syn_val ⊙ ⟦B⟧syn_val)^⊥ → A ⊗ B :: x.1 ⊢cf x.2A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥
y: syntactic
Hy: y ∈ (⟦A⟧syn_val ⊙ ⟦B⟧syn_val)^⊥A ⊗ B :: y.1 ⊢cf y.2exact (orth_prod_use _ _ (hyp A) (hyp B) y HA1 HB1 Hy).A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥
y: syntactic
Hy: y ∈ (⟦A⟧syn_val ⊙ ⟦B⟧syn_val)^⊥A :: B :: y.1 ⊢cf y.2A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥concl (A ⊗ B) ∈ (((⟦A⟧syn_val ⊙ ⟦B⟧syn_val)^⊥)^⊥)^⊥A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥∀ x : syntactic, x ∈ ⟦A⟧syn_val ⊙ ⟦B⟧syn_val → x.1 ⊢cf A ⊗ B :: x.2apply (ex' (tensorR _ _ _ _ _ A B (R_use _ _ _ HA2 Ha) (R_use _ _ _ HB2 Hb))); by rewrite ?H1, ?H2.A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥
x, a, b: syntactic
Ha: a ∈ ⟦A⟧syn_val
Hb: b ∈ ⟦B⟧syn_val
H1: x.1 ≡ₚ a.1 ++ b.1
H2: x.2 ≡ₚ a.2 ++ b.2x.1 ⊢cf A ⊗ B :: x.2A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥hyp (A ⅋ B) ∈ (⟦A⟧syn_val^⊥ ⊙ ⟦B⟧syn_val^⊥)^⊥A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥∀ x : syntactic, x ∈ ⟦A⟧syn_val^⊥ ⊙ ⟦B⟧syn_val^⊥ → A ⅋ B :: x.1 ⊢cf x.2apply (ex' (parL _ _ _ _ _ A B (L_use _ _ _ HA1 Ha) (L_use _ _ _ HB1 Hb))); by rewrite ?H1, ?H2.A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥
x, a, b: syntactic
Ha: a ∈ ⟦A⟧syn_val^⊥
Hb: b ∈ ⟦B⟧syn_val^⊥
H1: x.1 ≡ₚ a.1 ++ b.1
H2: x.2 ≡ₚ a.2 ++ b.2A ⅋ B :: x.1 ⊢cf x.2A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥concl (A ⅋ B) ∈ ((⟦A⟧syn_val^⊥ ⊙ ⟦B⟧syn_val^⊥)^⊥)^⊥A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥∀ x : syntactic, x ∈ (⟦A⟧syn_val^⊥ ⊙ ⟦B⟧syn_val^⊥)^⊥ → x.1 ⊢cf A ⅋ B :: x.2A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥
y: syntactic
Hy: y ∈ (⟦A⟧syn_val^⊥ ⊙ ⟦B⟧syn_val^⊥)^⊥y.1 ⊢cf A ⅋ B :: y.2exact (orth_prod_use _ _ (concl A) (concl B) y HA2 HB2 Hy).A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥
y: syntactic
Hy: y ∈ (⟦A⟧syn_val^⊥ ⊙ ⟦B⟧syn_val^⊥)^⊥y.1 ⊢cf A :: B :: y.2A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥hyp (A & B) ∈ ⟦A⟧syn_val ∩ ⟦B⟧syn_valA: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥hyp (A & B) ∈ ⟦A⟧syn_val ∧ hyp (A & B) ∈ ⟦B⟧syn_valA: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥
y: syntactic
Hy: y ∈ ⟦A⟧syn_val^⊥A & B :: y.1 ⊢cf y.2A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥
y: syntactic
Hy: y ∈ ⟦B⟧syn_val^⊥A & B :: y.1 ⊢cf y.2A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥
y: syntactic
Hy: y ∈ ⟦A⟧syn_val^⊥A & B :: y.1 ⊢cf y.2by apply (L_use (⟦A⟧syn_val)).A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥
y: syntactic
Hy: y ∈ ⟦A⟧syn_val^⊥A :: y.1 ⊢cf y.2A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥
y: syntactic
Hy: y ∈ ⟦B⟧syn_val^⊥A & B :: y.1 ⊢cf y.2by apply (L_use (⟦B⟧syn_val)).A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥
y: syntactic
Hy: y ∈ ⟦B⟧syn_val^⊥B :: y.1 ⊢cf y.2A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥concl (A & B) ∈ (⟦A⟧syn_val ∩ ⟦B⟧syn_val)^⊥A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥∀ x : syntactic, x ∈ ⟦A⟧syn_val ∩ ⟦B⟧syn_val → x.1 ⊢cf A & B :: x.2apply withR; [by apply (R_use (⟦A⟧syn_val)) | by apply (R_use (⟦B⟧syn_val))].A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥
x: syntactic
Ha: x ∈ ⟦A⟧syn_val
Hb: x ∈ ⟦B⟧syn_valx.1 ⊢cf A & B :: x.2A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥hyp (A ⊕ B) ∈ ((⟦A⟧syn_val ∪ ⟦B⟧syn_val)^⊥)^⊥A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥∀ x : syntactic, x ∈ (⟦A⟧syn_val ∪ ⟦B⟧syn_val)^⊥ → A ⊕ B :: x.1 ⊢cf x.2apply plusL; apply (L_use (⟦A⟧syn_val ∪ ⟦B⟧syn_val)); set_solver.A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥
y: syntactic
Hy: y ∈ (⟦A⟧syn_val ∪ ⟦B⟧syn_val)^⊥A ⊕ B :: y.1 ⊢cf y.2A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥concl (A ⊕ B) ∈ (((⟦A⟧syn_val ∪ ⟦B⟧syn_val)^⊥)^⊥)^⊥A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥∀ x : syntactic, x ∈ ⟦A⟧syn_val ∪ ⟦B⟧syn_val → x.1 ⊢cf A ⊕ B :: x.2A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥
x: syntactic
Hx: x ∈ ⟦A⟧syn_valx.1 ⊢cf A ⊕ B :: x.2A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥
x: syntactic
Hx: x ∈ ⟦B⟧syn_valx.1 ⊢cf A ⊕ B :: x.2A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥
x: syntactic
Hx: x ∈ ⟦A⟧syn_valx.1 ⊢cf A ⊕ B :: x.2by apply (R_use (⟦A⟧syn_val)).A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥
x: syntactic
Hx: x ∈ ⟦A⟧syn_valx.1 ⊢cf A :: x.2A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥
x: syntactic
Hx: x ∈ ⟦B⟧syn_valx.1 ⊢cf A ⊕ B :: x.2by apply (R_use (⟦B⟧syn_val)).A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
B: cformula
HA2: concl A ∈ ⟦A⟧syn_val^⊥
HB1: hyp B ∈ ⟦B⟧syn_val
HB2: concl B ∈ ⟦B⟧syn_val^⊥
x: syntactic
Hx: x ∈ ⟦B⟧syn_valx.1 ⊢cf B :: x.2A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥hyp (!A) ∈ ((⟦A⟧syn_val ∩ cph_J)^⊥)^⊥A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥hyp (!A) ∈ ⟦A⟧syn_val ∧ hyp (!A) ∈ cph_JA: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥hyp (!A) ∈ ⟦A⟧syn_valA: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥hyp (!A) ∈ cph_JA: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥hyp (!A) ∈ ⟦A⟧syn_valA: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥∀ x : syntactic, x ∈ ⟦A⟧syn_val^⊥ → !A :: x.1 ⊢cf x.2A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥
y: syntactic
Hy: y ∈ ⟦A⟧syn_val^⊥!A :: y.1 ⊢cf y.2by apply (L_use (⟦A⟧syn_val)).A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥
y: syntactic
Hy: y ∈ ⟦A⟧syn_val^⊥A :: y.1 ⊢cf y.2A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥hyp (!A) ∈ cph_Jby exists [A], [].A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥∃ Σ Π : list cformula, hyp (!A) = (‼Σ, ⁇Π)A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥concl (!A) ∈ (((⟦A⟧syn_val ∩ cph_J)^⊥)^⊥)^⊥A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥∀ x : syntactic, x ∈ ⟦A⟧syn_val ∩ cph_J → x.1 ⊢cf !A :: x.2A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥
Σ, Π: list cformula
Hx: (‼Σ, ⁇Π) ∈ ⟦A⟧syn_val(‼Σ, ⁇Π).1 ⊢cf !A :: (‼Σ, ⁇Π).2exact (R_use _ _ _ HA2 Hx).A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥
Σ, Π: list cformula
Hx: (‼Σ, ⁇Π) ∈ ⟦A⟧syn_val‼Σ ⊢cf A :: ⁇ΠA: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥hyp (? A) ∈ (⟦A⟧syn_val^⊥ ∩ cph_J)^⊥A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥∀ x : syntactic, x ∈ ⟦A⟧syn_val^⊥ ∩ cph_J → ? A :: x.1 ⊢cf x.2A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥
Σ, Π: list cformula
Hx: (‼Σ, ⁇Π) ∈ ⟦A⟧syn_val^⊥? A :: (‼Σ, ⁇Π).1 ⊢cf (‼Σ, ⁇Π).2exact (L_use _ _ _ HA1 Hx).A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥
Σ, Π: list cformula
Hx: (‼Σ, ⁇Π) ∈ ⟦A⟧syn_val^⊥A :: ‼Σ ⊢cf ⁇ΠA: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥concl (? A) ∈ ((⟦A⟧syn_val^⊥ ∩ cph_J)^⊥)^⊥A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥concl (? A) ∈ ⟦A⟧syn_val^⊥ ∧ concl (? A) ∈ cph_JA: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥concl (? A) ∈ ⟦A⟧syn_val^⊥A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥concl (? A) ∈ cph_JA: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥concl (? A) ∈ ⟦A⟧syn_val^⊥A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥∀ x : syntactic, x ∈ (⟦A⟧syn_val^⊥)^⊥ → x.1 ⊢cf ? A :: x.2A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥
y: syntactic
Hy: y ∈ (⟦A⟧syn_val^⊥)^⊥y.1 ⊢cf ? A :: y.2apply (R_use (⟦A⟧syn_val)); [done | by apply interp_fact].A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥
y: syntactic
Hy: y ∈ (⟦A⟧syn_val^⊥)^⊥y.1 ⊢cf A :: y.2A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥concl (? A) ∈ cph_Jby exists [], [A]. Qed.A: cformula
HA1: hyp A ∈ ⟦A⟧syn_val
HA2: concl A ∈ ⟦A⟧syn_val^⊥∃ Σ Π : list cformula, concl (? A) = (‼Σ, ⁇Π)
Two direct consequences: in the syntactic model, every bag of A
proves A, and every counter-bag of A refutes A.
A: cformula
x: syntacticx ∈ ⟦A⟧syn_val → x.1 ⊢cf A :: x.2apply R_use, okada. Qed.A: cformula
x: syntacticx ∈ ⟦A⟧syn_val → x.1 ⊢cf A :: x.2A: cformula
y: syntacticy ∈ ⟦A⟧syn_val^⊥ → A :: y.1 ⊢cf y.2apply L_use, okada. Qed.A: cformula
y: syntacticy ∈ ⟦A⟧syn_val^⊥ → A :: y.1 ⊢cf y.2
Every two-sided context is a phase of its own sequent: (Γ, Δ) is
the product of the hyp A for A ∈ Γ and the concl B for B ∈ Δ.
Γ, Δ: list cformula((Γ, Δ) : syntactic) ∈ ⨀ sq syn_val Γ ΔΓ, Δ: list cformula((Γ, Δ) : syntactic) ∈ ⨀ sq syn_val Γ Δ([], []) ∈ one_setB: cformula
Δ: list cformula
IH: ([], Δ) ∈ ⨀ sq syn_val [] Δ([], B :: Δ) ∈ ⟦B⟧syn_val^⊥ ⊙ ⨀ map (λ B0 : cformula, ⟦B0⟧syn_val^⊥) ΔA: cformula
Γ, Δ: list cformula
IH: (Γ, Δ) ∈ ⨀ sq syn_val Γ Δ(A :: Γ, Δ) ∈ ⟦A⟧syn_val ⊙ ⨀ (map (interp syn_val) Γ ++ map (λ B : cformula, ⟦B⟧syn_val^⊥) Δ)by apply elem_of_one_syn.([], []) ∈ one_setB: cformula
Δ: list cformula
IH: ([], Δ) ∈ ⨀ sq syn_val [] Δ([], B :: Δ) ∈ ⟦B⟧syn_val^⊥ ⊙ ⨀ map (λ B0 : cformula, ⟦B0⟧syn_val^⊥) ΔB: cformula
Δ: list cformula
IH: ([], Δ) ∈ ⨀ sq syn_val [] Δ∃ a b : syntactic, a ∈ ⟦B⟧syn_val^⊥ ∧ b ∈ ⨀ map (λ B0 : cformula, ⟦B0⟧syn_val^⊥) Δ ∧ ([], B :: Δ) ≡ a · bsplit_and!; [apply okada | exact IH | done].B: cformula
Δ: list cformula
IH: ([], Δ) ∈ ⨀ sq syn_val [] Δconcl B ∈ ⟦B⟧syn_val^⊥ ∧ ([], Δ) ∈ ⨀ map (λ B0 : cformula, ⟦B0⟧syn_val^⊥) Δ ∧ ([], B :: Δ) ≡ concl B · ([], Δ)A: cformula
Γ, Δ: list cformula
IH: (Γ, Δ) ∈ ⨀ sq syn_val Γ Δ(A :: Γ, Δ) ∈ ⟦A⟧syn_val ⊙ ⨀ (map (interp syn_val) Γ ++ map (λ B : cformula, ⟦B⟧syn_val^⊥) Δ)A: cformula
Γ, Δ: list cformula
IH: (Γ, Δ) ∈ ⨀ sq syn_val Γ Δ∃ a b : syntactic, a ∈ ⟦A⟧syn_val ∧ b ∈ ⨀ (map (interp syn_val) Γ ++ map (λ B : cformula, ⟦B⟧syn_val^⊥) Δ) ∧ (A :: Γ, Δ) ≡ a · bsplit_and!; [apply okada | exact IH | done]. Qed.A: cformula
Γ, Δ: list cformula
IH: (Γ, Δ) ∈ ⨀ sq syn_val Γ Δhyp A ∈ ⟦A⟧syn_val ∧ (Γ, Δ) ∈ ⨀ (map (interp syn_val) Γ ++ map (λ B : cformula, ⟦B⟧syn_val^⊥) Δ) ∧ (A :: Γ, Δ) ≡ hyp A · (Γ, Δ)
Completeness: a valid sequent has a cut-free proof. Validity in the
syntactic model puts (Γ, Δ) in the pole, and the pole is cut-free
provability.
Γ, Δ: list cformulaΓ ⊨ Δ → Γ ⊢cf ΔΓ, Δ: list cformulaΓ ⊨ Δ → Γ ⊢cf Δapply (elem_of_pole_syn (Γ, Δ)), (H syntactic syn_val (Γ, Δ)), ctx_self. Qed.Γ, Δ: list cformula
H: Γ ⊨ ΔΓ ⊢cf Δ
Cut elimination: every proof can be replaced by a cut-free one.
Γ, Δ: list cformulaΓ ⊢ Δ → Γ ⊢cf ΔΓ, Δ: list cformulaΓ ⊢ Δ → Γ ⊢cf Δby apply completeness, (soundness true). Qed.Γ, Δ: list cformula
H: Γ ⊢ ΔΓ ⊢cf Δ
As a consequence, cut is admissible in the cut-free calculus.
Γ₁, Γ₂, Δ₁, Δ₂: list cformula
A: cformulaΓ₁ ⊢cf A :: Δ₁ → A :: Γ₂ ⊢cf Δ₂ → Γ₁ ++ Γ₂ ⊢cf Δ₁ ++ Δ₂Γ₁, Γ₂, Δ₁, Δ₂: list cformula
A: cformulaΓ₁ ⊢cf A :: Δ₁ → A :: Γ₂ ⊢cf Δ₂ → Γ₁ ++ Γ₂ ⊢cf Δ₁ ++ Δ₂apply cut_elimination, (cut _ _ _ _ _ A); [done | |]; by apply cf_to_full. Qed.Γ₁, Γ₂, Δ₁, Δ₂: list cformula
A: cformula
H1: Γ₁ ⊢cf A :: Δ₁
H2: A :: Γ₂ ⊢cf Δ₂Γ₁ ++ Γ₂ ⊢cf Δ₁ ++ Δ₂
All three notions coincide.
Γ, Δ: list cformula(Γ ⊢ Δ ↔ Γ ⊨ Δ) ∧ (Γ ⊨ Δ ↔ Γ ⊢cf Δ)Γ, Δ: list cformula(Γ ⊢ Δ ↔ Γ ⊨ Δ) ∧ (Γ ⊨ Δ ↔ Γ ⊢cf Δ)Γ, Δ: list cformulaΓ ⊢ Δ → Γ ⊨ ΔΓ, Δ: list cformulaΓ ⊨ Δ → Γ ⊢ ΔΓ, Δ: list cformulaΓ ⊨ Δ → Γ ⊢cf ΔΓ, Δ: list cformulaΓ ⊢cf Δ → Γ ⊨ Δapply soundness.Γ, Δ: list cformulaΓ ⊢ Δ → Γ ⊨ ΔΓ, Δ: list cformulaΓ ⊨ Δ → Γ ⊢ Δby apply cf_to_full, completeness.Γ, Δ: list cformula
H: Γ ⊨ ΔΓ ⊢ Δapply completeness.Γ, Δ: list cformulaΓ ⊨ Δ → Γ ⊢cf Δapply soundness. Qed.Γ, Δ: list cformulaΓ ⊢cf Δ → Γ ⊨ Δ