Comparison: ILL inside CLL
Sequents
Γ ⊢ A,B,Δ Γ ⊢ ?A,?A,Δ Γ ⊢ A,Δ A,Γ ⊢ Δ
------------ ⅋R ------------- ?C ----------- ^⊥L ----------- ^⊥R
Γ ⊢ A⅋B,Δ Γ ⊢ ?A,Δ A^⊥,Γ ⊢ Δ Γ ⊢ A^⊥,Δ
Connectives
Negation
Semantics
Handling two calculi in one file
From LinearLogic.Classical Require Sequent. From LinearLogic.Intuitionistic Require Import Formula. From LinearLogic.Classical Require Import Formula. Module I := LinearLogic.Intuitionistic.Sequent. Module IPhase := LinearLogic.Intuitionistic.Phase. Module C := LinearLogic.Classical.Sequent. Import (notations) I C.
Sanity checks: the same notation, read in either scope.
The embedding
Fixpoint embed (A : iformula) : cformula :=
match A with
| IAtom p => $p
| IOne => 𝟙
| IBot => ⊥
| ITop => ⊤
| IZero => 𝟘
| ITensor A B => embed A ⊗ embed B
| ILolli A B => embed A ⊸ embed B
| IWith A B => embed A & embed B
| IPlus A B => embed A ⊕ embed B
| IBang A => !embed A
end.
Embedding commutes with banging a whole context. ILL promotion needs
this to become CLL promotion.
Σ: list iformulamap embed (‼Σ)%ill = ‼map embed Σby rewrite !map_map. Qed.Σ: list iformulamap embed (‼Σ)%ill = ‼map embed Σ
Every ILL proof is a CLL proof
- two-premise multiplicative rules (cut, ⊗R, ⊸L) split the conclusions as Δ₁ ++ Δ₂. One of the two parts is [], so we rewrite [C] as [] ++ [C] or [A ⊗ B] as A ⊗ B :: [] ++ [];
- ILL promotion ‼Σ ⊢ !A is CLL promotion ‼Σ ⊢ !A, ⁇Π with no ?-formulas, Π = [];
- the ⊸ rules are the derived C.lolliR and C.lolliL.
c: bool
Γ: list iformula
A: iformula(Γ ⊢[c] A)%ill → map embed Γ ⊢[c] [embed A]c: bool
Γ: list iformula
A: iformula(Γ ⊢[c] A)%ill → map embed Γ ⊢[c] [embed A]c: bool
A: iformula[embed A] ⊢[c] [embed A]c: bool
Γ, Δ: list iformula
A, C: iformula
H: c = true
H0: (Γ ⊢[c] A)%ill
H1: (A :: Δ ⊢[c] C)%ill
IHill1: map embed Γ ⊢[c] [embed A]
IHill2: embed A :: map embed Δ ⊢[c] [embed C]map embed Γ ++ map embed Δ ⊢[c] [embed C]c: bool
Γ, Γ': list iformula
C: iformula
H: Γ ≡ₚ Γ'
H0: (Γ ⊢[c] C)%ill
IHill: map embed Γ ⊢[c] [embed C]map embed Γ' ⊢[c] [embed C]c: bool[] ⊢[c] [𝟙]c: bool
Γ: list iformula
C: iformula
H: (Γ ⊢[c] C)%ill
IHill: map embed Γ ⊢[c] [embed C]𝟙 :: map embed Γ ⊢[c] [embed C]c: bool
Γ, Δ: list iformula
A, B: iformula
H: (Γ ⊢[c] A)%ill
H0: (Δ ⊢[c] B)%ill
IHill1: map embed Γ ⊢[c] [embed A]
IHill2: map embed Δ ⊢[c] [embed B]map embed Γ ++ map embed Δ ⊢[c] [embed A ⊗ embed B]c: bool
Γ: list iformula
A, B, C: iformula
H: (A :: B :: Γ ⊢[c] C)%ill
IHill: embed A :: embed B :: map embed Γ ⊢[c] [embed C]embed A ⊗ embed B :: map embed Γ ⊢[c] [embed C]c: bool
Γ: list iformula
A, B: iformula
H: (A :: Γ ⊢[c] B)%ill
IHill: embed A :: map embed Γ ⊢[c] [embed B]map embed Γ ⊢[c] [embed A ⊸ embed B]c: bool
Γ, Δ: list iformula
A, B, C: iformula
H: (Γ ⊢[c] A)%ill
H0: (B :: Δ ⊢[c] C)%ill
IHill1: map embed Γ ⊢[c] [embed A]
IHill2: embed B :: map embed Δ ⊢[c] [embed C]embed A ⊸ embed B :: map embed Γ ++ map embed Δ ⊢[c] [embed C]c: bool
Γ: list iformula
A, B: iformula
H: (Γ ⊢[c] A)%ill
H0: (Γ ⊢[c] B)%ill
IHill1: map embed Γ ⊢[c] [embed A]
IHill2: map embed Γ ⊢[c] [embed B]map embed Γ ⊢[c] [embed A & embed B]c: bool
Γ: list iformula
A, B, C: iformula
H: (A :: Γ ⊢[c] C)%ill
IHill: embed A :: map embed Γ ⊢[c] [embed C]embed A & embed B :: map embed Γ ⊢[c] [embed C]c: bool
Γ: list iformula
A, B, C: iformula
H: (B :: Γ ⊢[c] C)%ill
IHill: embed B :: map embed Γ ⊢[c] [embed C]embed A & embed B :: map embed Γ ⊢[c] [embed C]c: bool
Γ: list iformulamap embed Γ ⊢[c] [⊤]c: bool
Γ: list iformula
A, B: iformula
H: (Γ ⊢[c] A)%ill
IHill: map embed Γ ⊢[c] [embed A]map embed Γ ⊢[c] [embed A ⊕ embed B]c: bool
Γ: list iformula
A, B: iformula
H: (Γ ⊢[c] B)%ill
IHill: map embed Γ ⊢[c] [embed B]map embed Γ ⊢[c] [embed A ⊕ embed B]c: bool
Γ: list iformula
A, B, C: iformula
H: (A :: Γ ⊢[c] C)%ill
H0: (B :: Γ ⊢[c] C)%ill
IHill1: embed A :: map embed Γ ⊢[c] [embed C]
IHill2: embed B :: map embed Γ ⊢[c] [embed C]embed A ⊕ embed B :: map embed Γ ⊢[c] [embed C]c: bool
Γ: list iformula
C: iformula𝟘 :: map embed Γ ⊢[c] [embed C]c: bool
Σ: list iformula
A: iformula
H: (‼Σ ⊢[c] A)%ill
IHill: map embed (‼Σ)%ill ⊢[c] [embed A]map embed (‼Σ)%ill ⊢[c] [!embed A]c: bool
Γ: list iformula
A, C: iformula
H: (A :: Γ ⊢[c] C)%ill
IHill: embed A :: map embed Γ ⊢[c] [embed C]!embed A :: map embed Γ ⊢[c] [embed C]c: bool
Γ: list iformula
A, C: iformula
H: (Γ ⊢[c] C)%ill
IHill: map embed Γ ⊢[c] [embed C]!embed A :: map embed Γ ⊢[c] [embed C]c: bool
Γ: list iformula
A, C: iformula
H: (!A :: !A :: Γ ⊢[c] C)%ill
IHill: !embed A :: !embed A :: map embed Γ ⊢[c] [embed C]!embed A :: map embed Γ ⊢[c] [embed C]apply C.ax.c: bool
A: iformula[embed A] ⊢[c] [embed A]c: bool
Γ, Δ: list iformula
A, C: iformula
H: c = true
H0: (Γ ⊢[c] A)%ill
H1: (A :: Δ ⊢[c] C)%ill
IHill1: map embed Γ ⊢[c] [embed A]
IHill2: embed A :: map embed Δ ⊢[c] [embed C]map embed Γ ++ map embed Δ ⊢[c] [embed C]by eapply C.cut.c: bool
Γ, Δ: list iformula
A, C: iformula
H: c = true
H0: (Γ ⊢[c] A)%ill
H1: (A :: Δ ⊢[c] C)%ill
IHill1: map embed Γ ⊢[c] [embed A]
IHill2: embed A :: map embed Δ ⊢[c] [embed C]map embed Γ ++ map embed Δ ⊢[c] [] ++ [embed C]eapply C.ex'; [done | by apply Permutation_map | done].c: bool
Γ, Γ': list iformula
C: iformula
H: Γ ≡ₚ Γ'
H0: (Γ ⊢[c] C)%ill
IHill: map embed Γ ⊢[c] [embed C]map embed Γ' ⊢[c] [embed C]apply C.oneR.c: bool[] ⊢[c] [𝟙]by apply C.oneL.c: bool
Γ: list iformula
C: iformula
H: (Γ ⊢[c] C)%ill
IHill: map embed Γ ⊢[c] [embed C]𝟙 :: map embed Γ ⊢[c] [embed C]c: bool
Γ, Δ: list iformula
A, B: iformula
H: (Γ ⊢[c] A)%ill
H0: (Δ ⊢[c] B)%ill
IHill1: map embed Γ ⊢[c] [embed A]
IHill2: map embed Δ ⊢[c] [embed B]map embed Γ ++ map embed Δ ⊢[c] [embed A ⊗ embed B]by apply C.tensorR.c: bool
Γ, Δ: list iformula
A, B: iformula
H: (Γ ⊢[c] A)%ill
H0: (Δ ⊢[c] B)%ill
IHill1: map embed Γ ⊢[c] [embed A]
IHill2: map embed Δ ⊢[c] [embed B]map embed Γ ++ map embed Δ ⊢[c] embed A ⊗ embed B :: [] ++ []by apply C.tensorL.c: bool
Γ: list iformula
A, B, C: iformula
H: (A :: B :: Γ ⊢[c] C)%ill
IHill: embed A :: embed B :: map embed Γ ⊢[c] [embed C]embed A ⊗ embed B :: map embed Γ ⊢[c] [embed C]by apply C.lolliR.c: bool
Γ: list iformula
A, B: iformula
H: (A :: Γ ⊢[c] B)%ill
IHill: embed A :: map embed Γ ⊢[c] [embed B]map embed Γ ⊢[c] [embed A ⊸ embed B]c: bool
Γ, Δ: list iformula
A, B, C: iformula
H: (Γ ⊢[c] A)%ill
H0: (B :: Δ ⊢[c] C)%ill
IHill1: map embed Γ ⊢[c] [embed A]
IHill2: embed B :: map embed Δ ⊢[c] [embed C]embed A ⊸ embed B :: map embed Γ ++ map embed Δ ⊢[c] [embed C]by apply C.lolliL.c: bool
Γ, Δ: list iformula
A, B, C: iformula
H: (Γ ⊢[c] A)%ill
H0: (B :: Δ ⊢[c] C)%ill
IHill1: map embed Γ ⊢[c] [embed A]
IHill2: embed B :: map embed Δ ⊢[c] [embed C]embed A ⊸ embed B :: map embed Γ ++ map embed Δ ⊢[c] [] ++ [embed C]by apply C.withR.c: bool
Γ: list iformula
A, B: iformula
H: (Γ ⊢[c] A)%ill
H0: (Γ ⊢[c] B)%ill
IHill1: map embed Γ ⊢[c] [embed A]
IHill2: map embed Γ ⊢[c] [embed B]map embed Γ ⊢[c] [embed A & embed B]by apply C.withL1.c: bool
Γ: list iformula
A, B, C: iformula
H: (A :: Γ ⊢[c] C)%ill
IHill: embed A :: map embed Γ ⊢[c] [embed C]embed A & embed B :: map embed Γ ⊢[c] [embed C]by apply C.withL2.c: bool
Γ: list iformula
A, B, C: iformula
H: (B :: Γ ⊢[c] C)%ill
IHill: embed B :: map embed Γ ⊢[c] [embed C]embed A & embed B :: map embed Γ ⊢[c] [embed C]apply C.topR.c: bool
Γ: list iformulamap embed Γ ⊢[c] [⊤]by apply C.plusR1.c: bool
Γ: list iformula
A, B: iformula
H: (Γ ⊢[c] A)%ill
IHill: map embed Γ ⊢[c] [embed A]map embed Γ ⊢[c] [embed A ⊕ embed B]by apply C.plusR2.c: bool
Γ: list iformula
A, B: iformula
H: (Γ ⊢[c] B)%ill
IHill: map embed Γ ⊢[c] [embed B]map embed Γ ⊢[c] [embed A ⊕ embed B]by apply C.plusL.c: bool
Γ: list iformula
A, B, C: iformula
H: (A :: Γ ⊢[c] C)%ill
H0: (B :: Γ ⊢[c] C)%ill
IHill1: embed A :: map embed Γ ⊢[c] [embed C]
IHill2: embed B :: map embed Γ ⊢[c] [embed C]embed A ⊕ embed B :: map embed Γ ⊢[c] [embed C]apply C.zeroL.c: bool
Γ: list iformula
C: iformula𝟘 :: map embed Γ ⊢[c] [embed C]c: bool
Σ: list iformula
A: iformula
H: (‼Σ ⊢[c] A)%ill
IHill: map embed (‼Σ)%ill ⊢[c] [embed A]map embed (‼Σ)%ill ⊢[c] [!embed A]by apply (C.bangR _ _ []).c: bool
Σ: list iformula
A: iformula
H: (‼Σ ⊢[c] A)%ill
IHill: ‼map embed Σ ⊢[c] [embed A]‼map embed Σ ⊢[c] [!embed A]by apply C.bangD.c: bool
Γ: list iformula
A, C: iformula
H: (A :: Γ ⊢[c] C)%ill
IHill: embed A :: map embed Γ ⊢[c] [embed C]!embed A :: map embed Γ ⊢[c] [embed C]by apply C.bangW.c: bool
Γ: list iformula
A, C: iformula
H: (Γ ⊢[c] C)%ill
IHill: map embed Γ ⊢[c] [embed C]!embed A :: map embed Γ ⊢[c] [embed C]by apply C.bangC. Qed.c: bool
Γ: list iformula
A, C: iformula
H: (!A :: !A :: Γ ⊢[c] C)%ill
IHill: !embed A :: !embed A :: map embed Γ ⊢[c] [embed C]!embed A :: map embed Γ ⊢[c] [embed C]
Two negations agree classically
B: cformula[B ⊸ ⊥] ⊢cf [B^⊥]B: cformula[B ⊸ ⊥] ⊢cf [B^⊥]B: cformulaB ⊸ ⊥ :: [] ++ [] ⊢cf [B^⊥]apply C.parL; [apply C.ax | apply C.botL]. Qed.B: cformulaB ⊸ ⊥ :: [] ++ [] ⊢cf [B^⊥] ++ []B: cformula[B^⊥] ⊢cf [B ⊸ ⊥]B: cformula[B^⊥] ⊢cf [B ⊸ ⊥]B: cformula[B^⊥] ⊢cf [B^⊥; ⊥]apply C.botR, C.ax. Qed.B: cformula[B^⊥] ⊢cf [⊥; B^⊥]
Double-negation elimination, classically
-------- ax
A ⊢ A
---------- ⊥R
A ⊢ ⊥, A
------------ ⊸R ----- ⊥L
⊢ A ⊸ ⊥, A ⊥ ⊢
------------------------------- ⊸L
(A ⊸ ⊥) ⊸ ⊥ ⊢ A
A: iformulamap embed [∼∼A] ⊢cf [embed A]A: iformulamap embed [∼∼A] ⊢cf [embed A]A: iformula[(embed A ⊸ ⊥) ⊸ ⊥] ⊢cf [embed A]A: iformula(embed A ⊸ ⊥) ⊸ ⊥ :: [] ++ [] ⊢cf [embed A]apply C.lolliL; [apply C.lolliR, C.botR, C.ax | apply C.botL]. Qed.A: iformula(embed A ⊸ ⊥) ⊸ ⊥ :: [] ++ [] ⊢cf [embed A] ++ []
CLL is not conservative over ILL
∃ (Γ : list iformula) (A : iformula), ¬ (Γ ⊢ A)%ill ∧ map embed Γ ⊢ [embed A]∃ (Γ : list iformula) (A : iformula), ¬ (Γ ⊢ A)%ill ∧ map embed Γ ⊢ [embed A]¬ ([∼∼$0] ⊢ $0)%ill ∧ map embed [∼∼$0] ⊢ [embed $0]¬ ([∼∼$0] ⊢ $0)%illmap embed [∼∼$0] ⊢ [embed $0]apply IPhase.no_dne.¬ ([∼∼$0] ⊢ $0)%illapply C.cf_to_full, classical_dne. Qed.map embed [∼∼$0] ⊢ [embed $0]