Built with Alectryon, running vsrocq-language-server v9.1.1 5.4.0 / 2.5.0. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑ Ctrl+↓ to navigate, Ctrl+πŸ–±οΈ to focus. On Mac, use ⌘ instead of Ctrl.

Intuitionistic.Phase: phase semantics and soundness for ILL

Truth tables explain classical logic and Kripke models explain intuitionistic logic. Phase semantics (Girard 1987) plays the same role for linear logic, and its intuition is short:
Β· need not be idempotent, so m Β· m can differ from m. That is how the semantics refuses to duplicate resources.
The connectives βŠ—, βŠ•, πŸ™, 𝟘, ! require sets to be closed under a closure operator cl. Closed sets are called facts. In the intuitionistic semantics, cl is any closure operator that is stable under Β·, and βŠ₯ is just some fact. The classical semantics (Classical/Phase.v) is the special case cl X = X^βŠ₯βŠ₯, in which βŠ₯ determines everything else.
This file contains:
Intuitionistic/CutElim.v proves the converse and uses it to eliminate cuts.
[Loading ML file rocq-runtime.plugins.ring ... done]
[Loading ML file rocq-runtime.plugins.zify ... done]
[Loading ML file rocq-runtime.plugins.micromega_core ... done]
[Loading ML file rocq-runtime.plugins.micromega ... done]
[Loading ML file rocq-runtime.plugins.ssrmatching ... done]
[Loading ML file rocq-runtime.plugins.ssreflect ... done]
[Loading ML file rocq-runtime.plugins.btauto ... done]
[Loading ML file rocq-runtime.plugins.nsatz_core ... done]
[Loading ML file rocq-runtime.plugins.nsatz ... done]
From LinearLogic.Intuitionistic Require Export Sequent.

Phase spaces

Before the record we define the pointwise product of two sets, for any monoid operation op and equivalence eq: X βŠ™ Y = { z | z ≑ x Β· y for some x ∈ X, y ∈ Y }. The stability axiom of the record uses it.
Definition prod_with {M} (eq : relation M) (op : M -> M -> M) (X Y : propset M)
  : propset M := {[ z | βˆƒ a b, a ∈ X ∧ b ∈ Y ∧ eq z (op a b) ]}.
An intuitionistic phase space has four components:
Record phase_space : Type := {
  carrier :> Type;
  ph_equiv : Equiv carrier;
  ph_op : carrier -> carrier -> carrier;
  ph_e  : carrier;
  ph_cl : propset carrier -> propset carrier;
  ph_J  : propset carrier;
  ph_bot : propset carrier;

  (* (M, Β·, Ξ΅) is a commutative monoid up to ≑ *)
  ph_equivalence : Equivalence (@equiv _ ph_equiv);
  ph_op_proper : Proper (@equiv _ ph_equiv ==> @equiv _ ph_equiv ==> @equiv _ ph_equiv) ph_op;
  ph_assoc  : βˆ€ x y z, @equiv _ ph_equiv (ph_op x (ph_op y z)) (ph_op (ph_op x y) z);
  ph_comm   : βˆ€ x y, @equiv _ ph_equiv (ph_op x y) (ph_op y x);
  ph_unit_l : βˆ€ x, @equiv _ ph_equiv (ph_op ph_e x) x;

  (* cl is a closure operator: extensive, and monotone + idempotent
     (packed into ph_cl_least); it respects ≑ and is stable under Β· *)
  ph_cl_ext    : βˆ€ X, X βŠ† ph_cl X;
  ph_cl_least  : βˆ€ X Y, X βŠ† ph_cl Y -> ph_cl X βŠ† ph_cl Y;
  ph_cl_proper : βˆ€ X x y, @equiv _ ph_equiv x y -> x ∈ ph_cl X -> y ∈ ph_cl X;
  ph_cl_stable : βˆ€ X Y x y, x ∈ ph_cl X -> y ∈ ph_cl Y ->
      ph_op x y ∈ ph_cl (prod_with (@equiv _ ph_equiv) ph_op X Y);

  (* J: the reusable phases *)
  ph_J_proper : βˆ€ x y, @equiv _ ph_equiv x y -> x ∈ ph_J -> y ∈ ph_J;
  ph_J_unit   : ph_e ∈ ph_J;
  ph_J_op     : βˆ€ x y, x ∈ ph_J -> y ∈ ph_J -> ph_op x y ∈ ph_J;
  ph_J_weak   : βˆ€ x, x ∈ ph_J -> x ∈ ph_cl {[ z | @equiv _ ph_equiv z ph_e ]};
  ph_J_contr  : βˆ€ x, x ∈ ph_J -> x ∈ ph_cl {[ z | @equiv _ ph_equiv z (ph_op x x) ]};
}.

Arguments ph_op {_}. Arguments ph_e {_}. Arguments ph_cl {_}.
Arguments ph_J {_}. Arguments ph_bot {_}.
Arguments ph_assoc {_}. Arguments ph_comm {_}. Arguments ph_unit_l {_}.
Arguments ph_cl_ext {_}. Arguments ph_cl_least {_}. Arguments ph_cl_proper {_}.
Arguments ph_cl_stable {_}. Arguments ph_J_proper {_}. Arguments ph_J_unit {_}.
Arguments ph_J_op {_}. Arguments ph_J_weak {_}. Arguments ph_J_contr {_}.

#[export] Existing Instance ph_equiv.
#[export] Instance ph_equivalence' (P : phase_space) : Equivalence (≑@{P})
  := ph_equivalence P.
#[export] Instance ph_op_proper' (P : phase_space)
  : Proper ((≑) ==> (≑) ==> (≑)) (@ph_op P) := ph_op_proper P.

Notations

Declare Scope ill_phase_scope.
Open Scope ill_phase_scope.

Notation "x Β· y" := (ph_op x y) (at level 40, left associativity)
  : ill_phase_scope.
Notation Ξ΅ := ph_e.
Notation cl := ph_cl.
Notation J := ph_J.
{Ξ΅} up to ≑, and the pointwise product X βŠ™ Y = { z | z ≑ x Β· y, x ∈ X, y ∈ Y }.
Definition one_set {P : phase_space} : propset P := {[ z | z ≑ Ξ΅ ]}.
Definition prod_set {P : phase_space} (X Y : propset P) : propset P :=
  prod_with (≑) ph_op X Y.
Infix "βŠ™" := prod_set (at level 40, left associativity) : ill_phase_scope.
stdpp keeps propset membership opaque. Each set former therefore comes with an elem_of_… lemma, and with a SetUnfoldElemOf instance so that stdpp's set_unfold and set_solver can see through it.
Section elem_of.
  Context {P : phase_space}.
  Implicit Types (X Y : propset P) (z : P).

  
P: phase_space
z: P

z ∈ one_set ↔ z ≑ Ξ΅
P: phase_space
z: P

z ∈ one_set ↔ z ≑ Ξ΅
P: phase_space
z: P

z ∈ {[ z0 | z0 ≑ Ξ΅ ]} ↔ z ≑ Ξ΅
by rewrite elem_of_PropSet. Qed.
P: phase_space
X, Y: propset P
z: P

z ∈ X βŠ™ Y ↔ βˆƒ a b : P, a ∈ X ∧ b ∈ Y ∧ z ≑ a Β· b
P: phase_space
X, Y: propset P
z: P

z ∈ X βŠ™ Y ↔ βˆƒ a b : P, a ∈ X ∧ b ∈ Y ∧ z ≑ a Β· b
P: phase_space
X, Y: propset P
z: P

z ∈ {[ z0 | βˆƒ a b : P, a ∈ X ∧ b ∈ Y ∧ z0 ≑ a Β· b ]} ↔ βˆƒ a b : P, a ∈ X ∧ b ∈ Y ∧ z ≑ a Β· b
by rewrite elem_of_PropSet. Qed.
P: phase_space
z: P

SetUnfoldElemOf z one_set (z ≑ Ξ΅)
P: phase_space
z: P

SetUnfoldElemOf z one_set (z ≑ Ξ΅)
P: phase_space
z: P

z ∈ one_set ↔ z ≑ Ξ΅
apply elem_of_one. Qed.
P: phase_space
X, Y: propset P
z: P
Q, R: P β†’ Prop

(βˆ€ a : P, SetUnfoldElemOf a X (Q a)) β†’ (βˆ€ b : P, SetUnfoldElemOf b Y (R b)) β†’ SetUnfoldElemOf z (X βŠ™ Y) (βˆƒ a b : P, Q a ∧ R b ∧ z ≑ a Β· b)
P: phase_space
X, Y: propset P
z: P
Q, R: P β†’ Prop

(βˆ€ a : P, SetUnfoldElemOf a X (Q a)) β†’ (βˆ€ b : P, SetUnfoldElemOf b Y (R b)) β†’ SetUnfoldElemOf z (X βŠ™ Y) (βˆƒ a b : P, Q a ∧ R b ∧ z ≑ a Β· b)
P: phase_space
X, Y: propset P
z: P
Q, R: P β†’ Prop
HX: βˆ€ a : P, SetUnfoldElemOf a X (Q a)
HY: βˆ€ b : P, SetUnfoldElemOf b Y (R b)

SetUnfoldElemOf z (X βŠ™ Y) (βˆƒ a b : P, Q a ∧ R b ∧ z ≑ a Β· b)
P: phase_space
X, Y: propset P
z: P
Q, R: P β†’ Prop
HX: βˆ€ a : P, SetUnfoldElemOf a X (Q a)
HY: βˆ€ b : P, SetUnfoldElemOf b Y (R b)

z ∈ X βŠ™ Y ↔ βˆƒ a b : P, Q a ∧ R b ∧ z ≑ a Β· b
P: phase_space
X, Y: propset P
z: P
Q, R: P β†’ Prop
HX: βˆ€ a : P, SetUnfoldElemOf a X (Q a)
HY: βˆ€ b : P, SetUnfoldElemOf b Y (R b)

(βˆƒ a b : P, a ∈ X ∧ b ∈ Y ∧ z ≑ a Β· b) ↔ βˆƒ a b : P, Q a ∧ R b ∧ z ≑ a Β· b
P: phase_space
X, Y: propset P
z: P
Q, R: P β†’ Prop
HX: βˆ€ a : P, SetUnfoldElemOf a X (Q a)
HY: βˆ€ b : P, SetUnfoldElemOf b Y (R b)

(βˆƒ a b : P, Q a ∧ b ∈ Y ∧ z ≑ a Β· b) ↔ βˆƒ a b : P, Q a ∧ R b ∧ z ≑ a Β· b
by setoid_rewrite (Ξ» b, @set_unfold_elem_of _ _ _ b Y (R b) (HY b)). Qed. End elem_of.

Facts and the algebra of sets of phases

Most of the soundness proof is reasoning about inclusions X βŠ† Y between sets of phases, not about individual phases. This section collects the inclusions we need. cl and βŠ™ are monotone, and we register this with stdpp's Proper machinery so that βŠ† works with rewrite: in a goal L βŠ† R, rewrite H with H : X βŠ† X' replaces X by X' inside L. A proof of L βŠ† R then reads as a short calculation L βŠ† L' βŠ† … βŠ† R.
Section Facts.
  Context {P : phase_space}.
  Implicit Types (X Y Z G F : propset P) (x y z m g : P).

  
P: phase_space
X, Y: propset P

X βŠ† Y β†’ cl X βŠ† cl Y
P: phase_space
X, Y: propset P

X βŠ† Y β†’ cl X βŠ† cl Y
P: phase_space
X, Y: propset P
H: X βŠ† Y

cl X βŠ† cl Y
P: phase_space
X, Y: propset P
H: X βŠ† Y

X βŠ† cl Y
P: phase_space
X, Y: propset P
H: X βŠ† Y
x: P
Hx: x ∈ X

x ∈ cl Y
apply ph_cl_ext, H, Hx. Qed.
P: phase_space

Proper (subseteq ==> subseteq) cl
P: phase_space

Proper (subseteq ==> subseteq) cl
P: phase_space
X, Y: propset P

X βŠ† Y β†’ cl X βŠ† cl Y
apply cl_mono. Qed.
A fact is a closed set: cl F βŠ† F, so cl F = F.
  Definition fact F : Prop := cl F βŠ† F.

  
P: phase_space
X: propset P

fact (cl X)
P: phase_space
X: propset P

fact (cl X)
P: phase_space
X: propset P

cl X βŠ† cl X
done. Qed.
Facts are closed under ≑.
  
P: phase_space
F: propset P
x, y: P

fact F β†’ x ≑ y β†’ x ∈ F β†’ y ∈ F
P: phase_space
F: propset P
x, y: P

fact F β†’ x ≑ y β†’ x ∈ F β†’ y ∈ F
P: phase_space
F: propset P
x, y: P
HF: fact F
Hxy: x ≑ y
Hx: x ∈ F

y ∈ F
P: phase_space
F: propset P
x, y: P
HF: fact F
Hxy: x ≑ y
Hx: x ∈ F

x ∈ cl F
by apply ph_cl_ext. Qed.
cl X is the least fact containing X.
  
P: phase_space
X, F: propset P

fact F β†’ X βŠ† F β†’ cl X βŠ† F
P: phase_space
X, F: propset P

fact F β†’ X βŠ† F β†’ cl X βŠ† F
P: phase_space
X, F: propset P
HF: fact F
H: X βŠ† F

cl X βŠ† F
by rewrite H. Qed.

Products

βŠ™ is monotone, commutative, associative, and has {Ξ΅} as its unit, all up to βŠ†. prod_assoc_l and prod_assoc_r move the brackets to the left and to the right. The proofs unfold βŠ™ and use the monoid laws of Β·.
  
P: phase_space
X, X', Y, Y': propset P

X βŠ† X' β†’ Y βŠ† Y' β†’ X βŠ™ Y βŠ† X' βŠ™ Y'
P: phase_space
X, X', Y, Y': propset P

X βŠ† X' β†’ Y βŠ† Y' β†’ X βŠ™ Y βŠ† X' βŠ™ Y'
set_solver. Qed.
P: phase_space

Proper (subseteq ==> subseteq ==> subseteq) prod_set
P: phase_space

Proper (subseteq ==> subseteq ==> subseteq) prod_set
P: phase_space
X, X': propset P
HX: X βŠ† X'
Y, Y': propset P
HY: Y βŠ† Y'

X βŠ™ Y βŠ† X' βŠ™ Y'
by apply prod_mono. Qed.
P: phase_space
X, Y: propset P

X βŠ™ Y βŠ† Y βŠ™ X
P: phase_space
X, Y: propset P

X βŠ™ Y βŠ† Y βŠ™ X
P: phase_space
X, Y: propset P
m, a, b: P
Ha: a ∈ X
Hb: b ∈ Y
Hm: m ≑ a Β· b

m ∈ Y βŠ™ X
P: phase_space
X, Y: propset P
m, a, b: P
Ha: a ∈ X
Hb: b ∈ Y
Hm: m ≑ a Β· b

βˆƒ a0 b0 : P, a0 ∈ Y ∧ b0 ∈ X ∧ m ≑ a0 Β· b0
P: phase_space
X, Y: propset P
m, a, b: P
Ha: a ∈ X
Hb: b ∈ Y
Hm: m ≑ a Β· b

b ∈ Y ∧ a ∈ X ∧ m ≑ b Β· a
by rewrite Hm, ph_comm. Qed.
P: phase_space
X, Y, Z: propset P

X βŠ™ (Y βŠ™ Z) βŠ† X βŠ™ Y βŠ™ Z
P: phase_space
X, Y, Z: propset P

X βŠ™ (Y βŠ™ Z) βŠ† X βŠ™ Y βŠ™ Z
P: phase_space
X, Y, Z: propset P
m, a, n: P
Ha: a ∈ X
b, c: P
Hb: b ∈ Y
Hc: c ∈ Z
Hn: n ≑ b Β· c
Hm: m ≑ a Β· n

m ∈ X βŠ™ Y βŠ™ Z
P: phase_space
X, Y, Z: propset P
m, a, n: P
Ha: a ∈ X
b, c: P
Hb: b ∈ Y
Hc: c ∈ Z
Hn: n ≑ b Β· c
Hm: m ≑ a Β· n

βˆƒ a0 b0 : P, a0 ∈ X βŠ™ Y ∧ b0 ∈ Z ∧ m ≑ a0 Β· b0
P: phase_space
X, Y, Z: propset P
m, a, n: P
Ha: a ∈ X
b, c: P
Hb: b ∈ Y
Hc: c ∈ Z
Hn: n ≑ b Β· c
Hm: m ≑ a Β· n

a Β· b ∈ X βŠ™ Y ∧ c ∈ Z ∧ m ≑ a Β· b Β· c
P: phase_space
X, Y, Z: propset P
m, a, n: P
Ha: a ∈ X
b, c: P
Hb: b ∈ Y
Hc: c ∈ Z
Hn: n ≑ b Β· c
Hm: m ≑ a Β· n

a Β· b ∈ X βŠ™ Y
P: phase_space
X, Y, Z: propset P
m, a, n: P
Ha: a ∈ X
b, c: P
Hb: b ∈ Y
Hc: c ∈ Z
Hn: n ≑ b Β· c
Hm: m ≑ a Β· n
m ≑ a Β· b Β· c
P: phase_space
X, Y, Z: propset P
m, a, n: P
Ha: a ∈ X
b, c: P
Hb: b ∈ Y
Hc: c ∈ Z
Hn: n ≑ b Β· c
Hm: m ≑ a Β· n

a Β· b ∈ X βŠ™ Y
P: phase_space
X, Y, Z: propset P
m, a, n: P
Ha: a ∈ X
b, c: P
Hb: b ∈ Y
Hc: c ∈ Z
Hn: n ≑ b Β· c
Hm: m ≑ a Β· n

βˆƒ a0 b0 : P, a0 ∈ X ∧ b0 ∈ Y ∧ a Β· b ≑ a0 Β· b0
by exists a, b.
P: phase_space
X, Y, Z: propset P
m, a, n: P
Ha: a ∈ X
b, c: P
Hb: b ∈ Y
Hc: c ∈ Z
Hn: n ≑ b Β· c
Hm: m ≑ a Β· n

m ≑ a Β· b Β· c
by rewrite Hm, Hn, ph_assoc. Qed.
P: phase_space
X, Y, Z: propset P

X βŠ™ Y βŠ™ Z βŠ† X βŠ™ (Y βŠ™ Z)
P: phase_space
X, Y, Z: propset P

X βŠ™ Y βŠ™ Z βŠ† X βŠ™ (Y βŠ™ Z)
P: phase_space
X, Y, Z: propset P
m, n, c, a, b: P
Ha: a ∈ X
Hb: b ∈ Y
Hn: n ≑ a Β· b
Hc: c ∈ Z
Hm: m ≑ n Β· c

m ∈ X βŠ™ (Y βŠ™ Z)
P: phase_space
X, Y, Z: propset P
m, n, c, a, b: P
Ha: a ∈ X
Hb: b ∈ Y
Hn: n ≑ a Β· b
Hc: c ∈ Z
Hm: m ≑ n Β· c

βˆƒ a0 b0 : P, a0 ∈ X ∧ b0 ∈ Y βŠ™ Z ∧ m ≑ a0 Β· b0
P: phase_space
X, Y, Z: propset P
m, n, c, a, b: P
Ha: a ∈ X
Hb: b ∈ Y
Hn: n ≑ a Β· b
Hc: c ∈ Z
Hm: m ≑ n Β· c

a ∈ X ∧ b Β· c ∈ Y βŠ™ Z ∧ m ≑ a Β· (b Β· c)
P: phase_space
X, Y, Z: propset P
m, n, c, a, b: P
Ha: a ∈ X
Hb: b ∈ Y
Hn: n ≑ a Β· b
Hc: c ∈ Z
Hm: m ≑ n Β· c

b Β· c ∈ Y βŠ™ Z
P: phase_space
X, Y, Z: propset P
m, n, c, a, b: P
Ha: a ∈ X
Hb: b ∈ Y
Hn: n ≑ a Β· b
Hc: c ∈ Z
Hm: m ≑ n Β· c
m ≑ a Β· (b Β· c)
P: phase_space
X, Y, Z: propset P
m, n, c, a, b: P
Ha: a ∈ X
Hb: b ∈ Y
Hn: n ≑ a Β· b
Hc: c ∈ Z
Hm: m ≑ n Β· c

b Β· c ∈ Y βŠ™ Z
P: phase_space
X, Y, Z: propset P
m, n, c, a, b: P
Ha: a ∈ X
Hb: b ∈ Y
Hn: n ≑ a Β· b
Hc: c ∈ Z
Hm: m ≑ n Β· c

βˆƒ a0 b0 : P, a0 ∈ Y ∧ b0 ∈ Z ∧ b Β· c ≑ a0 Β· b0
by exists b, c.
P: phase_space
X, Y, Z: propset P
m, n, c, a, b: P
Ha: a ∈ X
Hb: b ∈ Y
Hn: n ≑ a Β· b
Hc: c ∈ Z
Hm: m ≑ n Β· c

m ≑ a Β· (b Β· c)
by rewrite Hm, Hn, ph_assoc. Qed.
P: phase_space
X: propset P

X βŠ† one_set βŠ™ X
P: phase_space
X: propset P

X βŠ† one_set βŠ™ X
P: phase_space
X: propset P
x: P
Hx: x ∈ X

x ∈ one_set βŠ™ X
P: phase_space
X: propset P
x: P
Hx: x ∈ X

βˆƒ a b : P, a ∈ one_set ∧ b ∈ X ∧ x ≑ a Β· b
P: phase_space
X: propset P
x: P
Hx: x ∈ X

Ξ΅ ∈ one_set ∧ x ∈ X ∧ x ≑ Ξ΅ Β· x
by rewrite elem_of_one, ph_unit_l. Qed.
The converse of prod_unit_l needs ≑-closure, so we state it for a fact F that contains X.
  
P: phase_space
X, F: propset P

fact F β†’ X βŠ† F β†’ one_set βŠ™ X βŠ† F
P: phase_space
X, F: propset P

fact F β†’ X βŠ† F β†’ one_set βŠ™ X βŠ† F
P: phase_space
X, F: propset P
HF: fact F
HX: X βŠ† F
m, e, x: P
He: e ≑ Ξ΅
Hx: x ∈ X
Hm: m ≑ e Β· x

m ∈ F
P: phase_space
X, F: propset P
HF: fact F
HX: X βŠ† F
m, e, x: P
He: e ≑ Ξ΅
Hx: x ∈ X
Hm: m ≑ e Β· x

x ≑ m
by rewrite Hm, He, ph_unit_l. Qed.
The stability axiom of the record, stated for sets.
  
P: phase_space
X, Y: propset P

cl X βŠ™ cl Y βŠ† cl (X βŠ™ Y)
P: phase_space
X, Y: propset P

cl X βŠ™ cl Y βŠ† cl (X βŠ™ Y)
P: phase_space
X, Y: propset P
m, x, y: P
Hx: x ∈ cl X
Hy: y ∈ cl Y
Hm: m ≑ x Β· y

m ∈ cl (X βŠ™ Y)
P: phase_space
X, Y: propset P
m, x, y: P
Hx: x ∈ cl X
Hy: y ∈ cl Y
Hm: m ≑ x Β· y

x Β· y ∈ cl (X βŠ™ Y)
by apply ph_cl_stable. Qed.
The workhorse of the soundness proof. To show that cl X βŠ™ G lies in a fact F, it is enough to check the generators X of the closure. This is where stability is used.
  
P: phase_space
X, G, F: propset P

fact F β†’ X βŠ™ G βŠ† F β†’ cl X βŠ™ G βŠ† F
P: phase_space
X, G, F: propset P

fact F β†’ X βŠ™ G βŠ† F β†’ cl X βŠ™ G βŠ† F
P: phase_space
X, G, F: propset P
HF: fact F
H: X βŠ™ G βŠ† F

cl X βŠ™ G βŠ† F
P: phase_space
X, G, F: propset P
HF: fact F
H: X βŠ™ G βŠ† F

cl (X βŠ™ G) βŠ† F
by apply cl_least_fact. Qed.

The phase connectives

The phase-space counterpart of each connective:
      πŸ™      ↦  cl {Ξ΅}
      X βŠ— Y  ↦  cl (X βŠ™ Y)
      X ⊸ Y  ↦  { m | βˆ€ a ∈ X, m Β· a ∈ Y }
      X & Y  ↦  X ∩ Y
      ⊀      ↦  M
      X βŠ• Y  ↦  cl (X βˆͺ Y)
      𝟘      ↦  cl βˆ…
      !X     ↦  cl (X ∩ J)
      βŠ₯      ↦  cl ph_bot            (part of the model)
⊸ and & need no closure: when X and Y are facts, so are X ⊸ Y and X ∩ Y.
  Definition ph_one : propset P := cl one_set.
  Definition ph_tensor X Y : propset P := cl (X βŠ™ Y).
  Definition ph_lolli X Y : propset P := {[ m | βˆ€ a, a ∈ X -> m Β· a ∈ Y ]}.
  Definition ph_top : propset P := {[ _ | True ]}.
  Definition ph_plus X Y : propset P := cl (X βˆͺ Y).
  Definition ph_zero : propset P := cl βˆ….
  Definition ph_bang X : propset P := cl (X ∩ J).

  
P: phase_space
X, Y: propset P
m: P

m ∈ ph_lolli X Y ↔ βˆ€ a : P, a ∈ X β†’ m Β· a ∈ Y
P: phase_space
X, Y: propset P
m: P

m ∈ ph_lolli X Y ↔ βˆ€ a : P, a ∈ X β†’ m Β· a ∈ Y
P: phase_space
X, Y: propset P
m: P

m ∈ {[ m0 | βˆ€ a : P, a ∈ X β†’ m0 Β· a ∈ Y ]} ↔ βˆ€ a : P, a ∈ X β†’ m Β· a ∈ Y
by rewrite elem_of_PropSet. Qed.
P: phase_space
m: P

m ∈ ph_top
P: phase_space
m: P

m ∈ ph_top
P: phase_space
m: P

m ∈ {[ _ | True ]}
by rewrite elem_of_PropSet. Qed.
P: phase_space
X, Y: propset P
m: P

SetUnfoldElemOf m (ph_lolli X Y) (βˆ€ a : P, a ∈ X β†’ m Β· a ∈ Y)
P: phase_space
X, Y: propset P
m: P

SetUnfoldElemOf m (ph_lolli X Y) (βˆ€ a : P, a ∈ X β†’ m Β· a ∈ Y)
P: phase_space
X, Y: propset P
m: P

m ∈ ph_lolli X Y ↔ βˆ€ a : P, a ∈ X β†’ m Β· a ∈ Y
apply elem_of_lolli. Qed.
P: phase_space
m: P

SetUnfoldElemOf m ph_top True
P: phase_space
m: P

SetUnfoldElemOf m ph_top True
P: phase_space
m: P

m ∈ ph_top ↔ True
split; [done | intros; apply elem_of_top]. Qed.
X ⊸ Y is the largest G with G βŠ™ X βŠ† Y. The two directions are the semantic ⊸R and ⊸L.
  
P: phase_space
X, Y, G: propset P

G βŠ™ X βŠ† Y β†’ G βŠ† ph_lolli X Y
P: phase_space
X, Y, G: propset P

G βŠ™ X βŠ† Y β†’ G βŠ† ph_lolli X Y
P: phase_space
X, Y, G: propset P
H: G βŠ™ X βŠ† Y
m: P
Hm: m ∈ G

m ∈ ph_lolli X Y
P: phase_space
X, Y, G: propset P
H: G βŠ™ X βŠ† Y
m: P
Hm: m ∈ G

βˆ€ a : P, a ∈ X β†’ m Β· a ∈ Y
P: phase_space
X, Y, G: propset P
H: G βŠ™ X βŠ† Y
m: P
Hm: m ∈ G
a: P
Ha: a ∈ X

m · a ∈ Y
P: phase_space
X, Y, G: propset P
H: G βŠ™ X βŠ† Y
m: P
Hm: m ∈ G
a: P
Ha: a ∈ X

βˆƒ a0 b : P, a0 ∈ G ∧ b ∈ X ∧ m Β· a ≑ a0 Β· b
by exists m, a. Qed.
P: phase_space
X, Y: propset P

fact Y β†’ ph_lolli X Y βŠ™ X βŠ† Y
P: phase_space
X, Y: propset P

fact Y β†’ ph_lolli X Y βŠ™ X βŠ† Y
P: phase_space
X, Y: propset P
HY: fact Y
m, f, a: P
Hf: f ∈ ph_lolli X Y
Ha: a ∈ X
Hm: m ≑ f Β· a

m ∈ Y
P: phase_space
X, Y: propset P
HY: fact Y
m, f, a: P
Hf: f ∈ ph_lolli X Y
Ha: a ∈ X
Hm: m ≑ f Β· a

f · a ∈ Y
P: phase_space
X, Y: propset P
HY: fact Y
m, f, a: P
Hf: βˆ€ a : P, a ∈ X β†’ f Β· a ∈ Y
Ha: a ∈ X
Hm: m ≑ f Β· a

f · a ∈ Y
by apply Hf. Qed.
P: phase_space
X, Y: propset P

fact Y β†’ fact (ph_lolli X Y)
P: phase_space
X, Y: propset P

fact Y β†’ fact (ph_lolli X Y)
P: phase_space
X, Y: propset P
HY: fact Y

fact (ph_lolli X Y)
apply lolli_intro, prod_cl_l, lolli_elim; done. Qed.
P: phase_space
X, Y: propset P

fact X β†’ fact Y β†’ fact (X ∩ Y)
P: phase_space
X, Y: propset P

fact X β†’ fact Y β†’ fact (X ∩ Y)
P: phase_space
X, Y: propset P
HX: fact X
HY: fact Y
m: P
Hm: m ∈ cl (X ∩ Y)

m ∈ X ∩ Y
P: phase_space
X, Y: propset P
HX: fact X
HY: fact Y
m: P
Hm: m ∈ cl (X ∩ Y)

m ∈ X ∧ m ∈ Y
split; [apply HX | apply HY]; revert m Hm; apply cl_mono; set_solver. Qed.
P: phase_space

fact ph_top
P: phase_space

fact ph_top
P: phase_space
m: P

m ∈ ph_top
apply elem_of_top. Qed.
Using a tensor X βŠ— Y next to G is the same as using X, Y and G side by side: the semantic βŠ—L.
  
P: phase_space
X, Y, G, F: propset P

fact F β†’ X βŠ™ (Y βŠ™ G) βŠ† F β†’ ph_tensor X Y βŠ™ G βŠ† F
P: phase_space
X, Y, G, F: propset P

fact F β†’ X βŠ™ (Y βŠ™ G) βŠ† F β†’ ph_tensor X Y βŠ™ G βŠ† F
P: phase_space
X, Y, G, F: propset P
HF: fact F
H: X βŠ™ (Y βŠ™ G) βŠ† F

ph_tensor X Y βŠ™ G βŠ† F
P: phase_space
X, Y, G, F: propset P
HF: fact F
H: X βŠ™ (Y βŠ™ G) βŠ† F

X βŠ™ Y βŠ™ G βŠ† F
by rewrite prod_assoc_r. Qed.
The axioms on J say that a phase of !X can be discarded (it lies in πŸ™) and duplicated (it lies in !X βŠ— !X). These are the semantic !W and !C.
  
P: phase_space
X: propset P

ph_bang X βŠ† ph_one
P: phase_space
X: propset P

ph_bang X βŠ† ph_one
P: phase_space
X: propset P

X ∩ J βŠ† cl one_set
P: phase_space
X: propset P
j: P
HJ: j ∈ J

j ∈ cl one_set
by apply ph_J_weak. Qed.
P: phase_space
X: propset P

ph_bang X βŠ† ph_tensor (ph_bang X) (ph_bang X)
P: phase_space
X: propset P

ph_bang X βŠ† ph_tensor (ph_bang X) (ph_bang X)
P: phase_space
X: propset P

X ∩ J βŠ† cl (ph_bang X βŠ™ ph_bang X)
P: phase_space
X: propset P
j: P
Hj: j ∈ X ∩ J

j ∈ cl (ph_bang X βŠ™ ph_bang X)
P: phase_space
X: propset P
j: P
Hj: j ∈ X ∩ J

j ∈ cl (X ∩ J βŠ™ (X ∩ J))
P: phase_space
X: propset P
j: P
Hj: j ∈ X ∩ J

j ∈ cl {[ z | z ≑ j Β· j ]}
P: phase_space
X: propset P
j: P
Hj: j ∈ X ∩ J

j ∈ J
set_solver. Qed. End Facts.

Interpreting formulas and sequents

A valuation v gives each propositional variable a set of phases. The variable $p denotes cl (v p), which makes it a fact.
Fixpoint interp {P : phase_space} (v : nat -> propset P) (A : iformula)
  : propset P :=
  match A with
  | IAtom p     => cl (v p)
  | IOne        => ph_one
  | IBot        => cl ph_bot
  | ITop        => ph_top
  | IZero       => ph_zero
  | ITensor A B => ph_tensor (interp v A) (interp v B)
  | ILolli A B  => ph_lolli (interp v A) (interp v B)
  | IWith A B   => interp v A ∩ interp v B
  | IPlus A B   => ph_plus (interp v A) (interp v B)
  | IBang A     => ph_bang (interp v A)
  end.

Notation "⟦ A ⟧ v" := (interp v A)
  (at level 1, A at level 200, v at level 1, format "⟦ A ⟧ v")
  : ill_phase_scope.
A context [A₁; …; Aβ‚™] denotes ⟦Aβ‚βŸ§ βŠ™ … βŠ™ ⟦Aβ‚™βŸ§ βŠ™ {Ξ΅}: the bags obtained by taking one bag for each hypothesis and combining them.
Fixpoint interp_ctx {P : phase_space} (v : nat -> propset P)
    (Ξ“ : list iformula) : propset P :=
  match Ξ“ with
  | []     => one_set
  | A :: Ξ“ => ⟦A⟧v βŠ™ interp_ctx v Ξ“
  end.

Notation "β¦… Ξ“ ⦆ v" := (interp_ctx v Ξ“)
  (at level 1, Ξ“ at level 200, v at level 1, format "β¦… Ξ“ ⦆ v")
  : ill_phase_scope.
A sequent is valid in a model when the bags for the hypotheses always give a bag for the conclusion. It is valid outright when that holds in every phase space under every valuation.
Definition valid_in {P : phase_space} (v : nat -> propset P) Ξ“ A : Prop :=
  ⦅Γ⦆v βŠ† ⟦A⟧v.

Definition valid (Ξ“ : list iformula) (A : iformula) : Prop :=
  βˆ€ (P : phase_space) (v : nat -> propset P), valid_in v Ξ“ A.

Notation "Ξ“ ⊨ A" := (valid Ξ“ A) (at level 80, no associativity)
  : ill_phase_scope.

Section Interp.
  Context {P : phase_space} (v : nat -> propset P).
Every formula denotes a fact.
  
P: phase_space
v: nat β†’ propset P
A: iformula

fact ⟦A⟧v
P: phase_space
v: nat β†’ propset P
A: iformula

fact ⟦A⟧v
induction A; cbn [interp]; unfold ph_one, ph_zero, ph_tensor, ph_plus, ph_bang; auto using fact_cl, fact_lolli, fact_inter, fact_top. Qed.
Split a bag for Ξ“ ++ Ξ” into a bag for Ξ“ and a bag for Ξ”.
  
P: phase_space
v: nat β†’ propset P
Ξ“, Ξ”: list iformula

β¦…Ξ“ ++ Δ⦆v βŠ† ⦅Γ⦆v βŠ™ ⦅Δ⦆v
P: phase_space
v: nat β†’ propset P
Ξ“, Ξ”: list iformula

β¦…Ξ“ ++ Δ⦆v βŠ† ⦅Γ⦆v βŠ™ ⦅Δ⦆v
P: phase_space
v: nat β†’ propset P
Ξ”: list iformula

⦅Δ⦆v βŠ† one_set βŠ™ ⦅Δ⦆v
P: phase_space
v: nat β†’ propset P
A: iformula
Ξ“, Ξ”: list iformula
IH: β¦…Ξ“ ++ Δ⦆v βŠ† ⦅Γ⦆v βŠ™ ⦅Δ⦆v
⟦A⟧v βŠ™ β¦…Ξ“ ++ Δ⦆v βŠ† ⟦A⟧v βŠ™ ⦅Γ⦆v βŠ™ ⦅Δ⦆v
P: phase_space
v: nat β†’ propset P
Ξ”: list iformula

⦅Δ⦆v βŠ† one_set βŠ™ ⦅Δ⦆v
apply prod_unit_l.
P: phase_space
v: nat β†’ propset P
A: iformula
Ξ“, Ξ”: list iformula
IH: β¦…Ξ“ ++ Δ⦆v βŠ† ⦅Γ⦆v βŠ™ ⦅Δ⦆v

⟦A⟧v βŠ™ β¦…Ξ“ ++ Δ⦆v βŠ† ⟦A⟧v βŠ™ ⦅Γ⦆v βŠ™ ⦅Δ⦆v
by rewrite IH, prod_assoc_l. Qed.
Β· is commutative, so the order of hypotheses is irrelevant. This is the semantic content of the exchange rule.
  
P: phase_space
v: nat β†’ propset P
Ξ“, Ξ“': list iformula

Ξ“ β‰‘β‚š Ξ“' β†’ ⦅Γ⦆v βŠ† β¦…Ξ“'⦆v
P: phase_space
v: nat β†’ propset P
Ξ“, Ξ“': list iformula

Ξ“ β‰‘β‚š Ξ“' β†’ ⦅Γ⦆v βŠ† β¦…Ξ“'⦆v
P: phase_space
v: nat β†’ propset P

one_set βŠ† one_set
P: phase_space
v: nat β†’ propset P
A: iformula
Ξ“, Ξ“': list iformula
IH: ⦅Γ⦆v βŠ† β¦…Ξ“'⦆v
⟦A⟧v βŠ™ ⦅Γ⦆v βŠ† ⟦A⟧v βŠ™ β¦…Ξ“'⦆v
P: phase_space
v: nat β†’ propset P
A, B: iformula
Ξ“: list iformula
⟦B⟧v βŠ™ (⟦A⟧v βŠ™ ⦅Γ⦆v) βŠ† ⟦A⟧v βŠ™ (⟦B⟧v βŠ™ ⦅Γ⦆v)
P: phase_space
v: nat β†’ propset P
Ξ“, Ξ“', Ξ“'': list iformula
IH1: ⦅Γ⦆v βŠ† β¦…Ξ“'⦆v
IH2: β¦…Ξ“'⦆v βŠ† β¦…Ξ“''⦆v
⦅Γ⦆v βŠ† β¦…Ξ“''⦆v
P: phase_space
v: nat β†’ propset P

one_set βŠ† one_set
done.
P: phase_space
v: nat β†’ propset P
A: iformula
Ξ“, Ξ“': list iformula
IH: ⦅Γ⦆v βŠ† β¦…Ξ“'⦆v

⟦A⟧v βŠ™ ⦅Γ⦆v βŠ† ⟦A⟧v βŠ™ β¦…Ξ“'⦆v
by rewrite IH.
P: phase_space
v: nat β†’ propset P
A, B: iformula
Ξ“: list iformula

⟦B⟧v βŠ™ (⟦A⟧v βŠ™ ⦅Γ⦆v) βŠ† ⟦A⟧v βŠ™ (⟦B⟧v βŠ™ ⦅Γ⦆v)
by rewrite prod_assoc_l, (prod_comm (⟦B⟧v)), prod_assoc_r.
P: phase_space
v: nat β†’ propset P
Ξ“, Ξ“', Ξ“'': list iformula
IH1: ⦅Γ⦆v βŠ† β¦…Ξ“'⦆v
IH2: β¦…Ξ“'⦆v βŠ† β¦…Ξ“''⦆v

⦅Γ⦆v βŠ† β¦…Ξ“''⦆v
by rewrite IH1, IH2. Qed.
A bag for a banged context β€ΌΞ£ lies in the closure of the bags that are both in ⦅‼Σ⦆ and reusable. Promotion uses this.
  
P: phase_space
v: nat β†’ propset P
Ξ£: list iformula

⦅‼Σ⦆v βŠ† cl (⦅‼Σ⦆v ∩ J)
P: phase_space
v: nat β†’ propset P
Ξ£: list iformula

⦅‼Σ⦆v βŠ† cl (⦅‼Σ⦆v ∩ J)
P: phase_space
v: nat β†’ propset P

one_set βŠ† cl (one_set ∩ J)
P: phase_space
v: nat β†’ propset P
A: iformula
Ξ£: list iformula
IH: ⦅‼Σ⦆v βŠ† cl (⦅‼Σ⦆v ∩ J)
ph_bang ⟦A⟧v βŠ™ ⦅‼Σ⦆v βŠ† cl ((ph_bang ⟦A⟧v βŠ™ ⦅‼Σ⦆v) ∩ J)
P: phase_space
v: nat β†’ propset P

one_set βŠ† cl (one_set ∩ J)
P: phase_space
v: nat β†’ propset P
m: P
Hm: m ∈ one_set

m ∈ cl (one_set ∩ J)
P: phase_space
v: nat β†’ propset P
m: P
Hm: m ∈ one_set

m ∈ one_set ∧ m ∈ J
P: phase_space
v: nat β†’ propset P
m: P
Hm: m ∈ one_set

m ∈ J
P: phase_space
v: nat β†’ propset P
m: P
Hm: m ≑ Ξ΅

m ∈ J
apply (ph_J_proper Ξ΅); [by symmetry | apply ph_J_unit].
P: phase_space
v: nat β†’ propset P
A: iformula
Ξ£: list iformula
IH: ⦅‼Σ⦆v βŠ† cl (⦅‼Σ⦆v ∩ J)

ph_bang ⟦A⟧v βŠ™ ⦅‼Σ⦆v βŠ† cl ((ph_bang ⟦A⟧v βŠ™ ⦅‼Σ⦆v) ∩ J)
P: phase_space
v: nat β†’ propset P
A: iformula
Ξ£: list iformula
IH: ⦅‼Σ⦆v βŠ† cl (⦅‼Σ⦆v ∩ J)

ph_bang ⟦A⟧v βŠ™ cl (⦅‼Σ⦆v ∩ J) βŠ† cl ((ph_bang ⟦A⟧v βŠ™ ⦅‼Σ⦆v) ∩ J)
P: phase_space
v: nat β†’ propset P
A: iformula
Ξ£: list iformula
IH: ⦅‼Σ⦆v βŠ† cl (⦅‼Σ⦆v ∩ J)

cl (⟦A⟧v ∩ J) βŠ™ cl (⦅‼Σ⦆v ∩ J) βŠ† cl ((cl (⟦A⟧v ∩ J) βŠ™ ⦅‼Σ⦆v) ∩ J)
P: phase_space
v: nat β†’ propset P
A: iformula
Ξ£: list iformula
IH: ⦅‼Σ⦆v βŠ† cl (⦅‼Σ⦆v ∩ J)

cl (⟦A⟧v ∩ J βŠ™ (⦅‼Σ⦆v ∩ J)) βŠ† cl ((cl (⟦A⟧v ∩ J) βŠ™ ⦅‼Σ⦆v) ∩ J)
P: phase_space
v: nat β†’ propset P
A: iformula
Ξ£: list iformula
IH: ⦅‼Σ⦆v βŠ† cl (⦅‼Σ⦆v ∩ J)

⟦A⟧v ∩ J βŠ™ (⦅‼Σ⦆v ∩ J) βŠ† (cl (⟦A⟧v ∩ J) βŠ™ ⦅‼Σ⦆v) ∩ J
P: phase_space
v: nat β†’ propset P
A: iformula
Ξ£: list iformula
IH: ⦅‼Σ⦆v βŠ† cl (⦅‼Σ⦆v ∩ J)
m, a, g: P
Ha: a ∈ ⟦A⟧v
HJa: a ∈ J
Hg: g ∈ ⦅‼Σ⦆v
HJg: g ∈ J
Hm: m ≑ a Β· g

m ∈ (cl (⟦A⟧v ∩ J) βŠ™ ⦅‼Σ⦆v) ∩ J
P: phase_space
v: nat β†’ propset P
A: iformula
Ξ£: list iformula
IH: ⦅‼Σ⦆v βŠ† cl (⦅‼Σ⦆v ∩ J)
m, a, g: P
Ha: a ∈ ⟦A⟧v
HJa: a ∈ J
Hg: g ∈ ⦅‼Σ⦆v
HJg: g ∈ J
Hm: m ≑ a Β· g

m ∈ cl (⟦A⟧v ∩ J) βŠ™ ⦅‼Σ⦆v ∧ m ∈ J
P: phase_space
v: nat β†’ propset P
A: iformula
Ξ£: list iformula
IH: ⦅‼Σ⦆v βŠ† cl (⦅‼Σ⦆v ∩ J)
m, a, g: P
Ha: a ∈ ⟦A⟧v
HJa: a ∈ J
Hg: g ∈ ⦅‼Σ⦆v
HJg: g ∈ J
Hm: m ≑ a Β· g

m ∈ cl (⟦A⟧v ∩ J) βŠ™ ⦅‼Σ⦆v
P: phase_space
v: nat β†’ propset P
A: iformula
Ξ£: list iformula
IH: ⦅‼Σ⦆v βŠ† cl (⦅‼Σ⦆v ∩ J)
m, a, g: P
Ha: a ∈ ⟦A⟧v
HJa: a ∈ J
Hg: g ∈ ⦅‼Σ⦆v
HJg: g ∈ J
Hm: m ≑ a Β· g
m ∈ J
P: phase_space
v: nat β†’ propset P
A: iformula
Ξ£: list iformula
IH: ⦅‼Σ⦆v βŠ† cl (⦅‼Σ⦆v ∩ J)
m, a, g: P
Ha: a ∈ ⟦A⟧v
HJa: a ∈ J
Hg: g ∈ ⦅‼Σ⦆v
HJg: g ∈ J
Hm: m ≑ a Β· g

m ∈ cl (⟦A⟧v ∩ J) βŠ™ ⦅‼Σ⦆v
P: phase_space
v: nat β†’ propset P
A: iformula
Ξ£: list iformula
IH: ⦅‼Σ⦆v βŠ† cl (⦅‼Σ⦆v ∩ J)
m, a, g: P
Ha: a ∈ ⟦A⟧v
HJa: a ∈ J
Hg: g ∈ ⦅‼Σ⦆v
HJg: g ∈ J
Hm: m ≑ a Β· g

βˆƒ a0 b : P, a0 ∈ cl (⟦A⟧v ∩ J) ∧ b ∈ ⦅‼Σ⦆v ∧ m ≑ a0 Β· b
P: phase_space
v: nat β†’ propset P
A: iformula
Ξ£: list iformula
IH: ⦅‼Σ⦆v βŠ† cl (⦅‼Σ⦆v ∩ J)
m, a, g: P
Ha: a ∈ ⟦A⟧v
HJa: a ∈ J
Hg: g ∈ ⦅‼Σ⦆v
HJg: g ∈ J
Hm: m ≑ a Β· g

a ∈ cl (⟦A⟧v ∩ J) ∧ g ∈ ⦅‼Σ⦆v ∧ m ≑ a Β· g
split_and!; [by apply ph_cl_ext | done..].
P: phase_space
v: nat β†’ propset P
A: iformula
Ξ£: list iformula
IH: ⦅‼Σ⦆v βŠ† cl (⦅‼Σ⦆v ∩ J)
m, a, g: P
Ha: a ∈ ⟦A⟧v
HJa: a ∈ J
Hg: g ∈ ⦅‼Σ⦆v
HJg: g ∈ J
Hm: m ≑ a Β· g

m ∈ J
apply (ph_J_proper (a Β· g)); [by symmetry | by apply ph_J_op]. Qed. End Interp.

Soundness

Every derivable sequent is valid. The proof is by induction on the derivation. Each case is a short calculation with the inclusions above: a right rule builds the conclusion from the premises, and a left rule A :: Ξ“ ⊒ C reduces ⟦A⟧ βŠ™ ⦅Γ⦆ to the generators of ⟦A⟧ with prod_cl_l. c is arbitrary, so this covers the calculus with cut and the cut-free calculus alike.
c: bool
Ξ“: list iformula
A: iformula

Ξ“ ⊒[c] A β†’ Ξ“ ⊨ A
c: bool
Ξ“: list iformula
A: iformula

Ξ“ ⊒[c] A β†’ Ξ“ ⊨ A
c: bool
Ξ“: list iformula
A: iformula
H: Ξ“ ⊒[c] A
P: phase_space
v: nat β†’ propset P

valid_in v Ξ“ A
c: bool
A: iformula
P: phase_space
v: nat β†’ propset P

⟦A⟧v βŠ™ one_set βŠ† ⟦A⟧v
c: bool
Ξ“, Ξ”: list iformula
A, C: iformula
H: c = true
H0: Ξ“ ⊒[c] A
H1: A :: Ξ” ⊒[c] C
P: phase_space
v: nat β†’ propset P
IHill1: ⦅Γ⦆v βŠ† ⟦A⟧v
IHill2: ⟦A⟧v βŠ™ ⦅Δ⦆v βŠ† ⟦C⟧v
β¦…Ξ“ ++ Δ⦆v βŠ† ⟦C⟧v
c: bool
Ξ“, Ξ“': list iformula
C: iformula
H: Ξ“ β‰‘β‚š Ξ“'
H0: Ξ“ ⊒[c] C
P: phase_space
v: nat β†’ propset P
IHill: ⦅Γ⦆v βŠ† ⟦C⟧v
β¦…Ξ“'⦆v βŠ† ⟦C⟧v
c: bool
P: phase_space
v: nat β†’ propset P
one_set βŠ† ph_one
c: bool
Ξ“: list iformula
C: iformula
H: Ξ“ ⊒[c] C
P: phase_space
v: nat β†’ propset P
IHill: ⦅Γ⦆v βŠ† ⟦C⟧v
ph_one βŠ™ ⦅Γ⦆v βŠ† ⟦C⟧v
c: bool
Ξ“, Ξ”: list iformula
A, B: iformula
H: Ξ“ ⊒[c] A
H0: Ξ” ⊒[c] B
P: phase_space
v: nat β†’ propset P
IHill1: ⦅Γ⦆v βŠ† ⟦A⟧v
IHill2: ⦅Δ⦆v βŠ† ⟦B⟧v
β¦…Ξ“ ++ Δ⦆v βŠ† ph_tensor ⟦A⟧v ⟦B⟧v
c: bool
Ξ“: list iformula
A, B, C: iformula
H: A :: B :: Ξ“ ⊒[c] C
P: phase_space
v: nat β†’ propset P
IHill: ⟦A⟧v βŠ™ (⟦B⟧v βŠ™ ⦅Γ⦆v) βŠ† ⟦C⟧v
ph_tensor ⟦A⟧v ⟦B⟧v βŠ™ ⦅Γ⦆v βŠ† ⟦C⟧v
c: bool
Ξ“: list iformula
A, B: iformula
H: A :: Ξ“ ⊒[c] B
P: phase_space
v: nat β†’ propset P
IHill: ⟦A⟧v βŠ™ ⦅Γ⦆v βŠ† ⟦B⟧v
⦅Γ⦆v βŠ† ph_lolli ⟦A⟧v ⟦B⟧v
c: bool
Ξ“, Ξ”: list iformula
A, B, C: iformula
H: Ξ“ ⊒[c] A
H0: B :: Ξ” ⊒[c] C
P: phase_space
v: nat β†’ propset P
IHill1: ⦅Γ⦆v βŠ† ⟦A⟧v
IHill2: ⟦B⟧v βŠ™ ⦅Δ⦆v βŠ† ⟦C⟧v
ph_lolli ⟦A⟧v ⟦B⟧v βŠ™ β¦…Ξ“ ++ Δ⦆v βŠ† ⟦C⟧v
c: bool
Ξ“: list iformula
A, B: iformula
H: Ξ“ ⊒[c] A
H0: Ξ“ ⊒[c] B
P: phase_space
v: nat β†’ propset P
IHill1: ⦅Γ⦆v βŠ† ⟦A⟧v
IHill2: ⦅Γ⦆v βŠ† ⟦B⟧v
⦅Γ⦆v βŠ† ⟦A⟧v ∩ ⟦B⟧v
c: bool
Ξ“: list iformula
A, B, C: iformula
H: A :: Ξ“ ⊒[c] C
P: phase_space
v: nat β†’ propset P
IHill: ⟦A⟧v βŠ™ ⦅Γ⦆v βŠ† ⟦C⟧v
⟦A⟧v ∩ ⟦B⟧v βŠ™ ⦅Γ⦆v βŠ† ⟦C⟧v
c: bool
Ξ“: list iformula
A, B, C: iformula
H: B :: Ξ“ ⊒[c] C
P: phase_space
v: nat β†’ propset P
IHill: ⟦B⟧v βŠ™ ⦅Γ⦆v βŠ† ⟦C⟧v
⟦A⟧v ∩ ⟦B⟧v βŠ™ ⦅Γ⦆v βŠ† ⟦C⟧v
c: bool
Ξ“: list iformula
P: phase_space
v: nat β†’ propset P
⦅Γ⦆v βŠ† ph_top
c: bool
Ξ“: list iformula
A, B: iformula
H: Ξ“ ⊒[c] A
P: phase_space
v: nat β†’ propset P
IHill: ⦅Γ⦆v βŠ† ⟦A⟧v
⦅Γ⦆v βŠ† ph_plus ⟦A⟧v ⟦B⟧v
c: bool
Ξ“: list iformula
A, B: iformula
H: Ξ“ ⊒[c] B
P: phase_space
v: nat β†’ propset P
IHill: ⦅Γ⦆v βŠ† ⟦B⟧v
⦅Γ⦆v βŠ† ph_plus ⟦A⟧v ⟦B⟧v
c: bool
Ξ“: list iformula
A, B, C: iformula
H: A :: Ξ“ ⊒[c] C
H0: B :: Ξ“ ⊒[c] C
P: phase_space
v: nat β†’ propset P
IHill1: ⟦A⟧v βŠ™ ⦅Γ⦆v βŠ† ⟦C⟧v
IHill2: ⟦B⟧v βŠ™ ⦅Γ⦆v βŠ† ⟦C⟧v
ph_plus ⟦A⟧v ⟦B⟧v βŠ™ ⦅Γ⦆v βŠ† ⟦C⟧v
c: bool
Ξ“: list iformula
C: iformula
P: phase_space
v: nat β†’ propset P
ph_zero βŠ™ ⦅Γ⦆v βŠ† ⟦C⟧v
c: bool
Ξ£: list iformula
A: iformula
H: β€ΌΞ£ ⊒[c] A
P: phase_space
v: nat β†’ propset P
IHill: ⦅‼Σ⦆v βŠ† ⟦A⟧v
⦅‼Σ⦆v βŠ† ph_bang ⟦A⟧v
c: bool
Ξ“: list iformula
A, C: iformula
H: A :: Ξ“ ⊒[c] C
P: phase_space
v: nat β†’ propset P
IHill: ⟦A⟧v βŠ™ ⦅Γ⦆v βŠ† ⟦C⟧v
ph_bang ⟦A⟧v βŠ™ ⦅Γ⦆v βŠ† ⟦C⟧v
c: bool
Ξ“: list iformula
A, C: iformula
H: Ξ“ ⊒[c] C
P: phase_space
v: nat β†’ propset P
IHill: ⦅Γ⦆v βŠ† ⟦C⟧v
ph_bang ⟦A⟧v βŠ™ ⦅Γ⦆v βŠ† ⟦C⟧v
c: bool
Ξ“: list iformula
A, C: iformula
H: !A :: !A :: Ξ“ ⊒[c] C
P: phase_space
v: nat β†’ propset P
IHill: ph_bang ⟦A⟧v βŠ™ (ph_bang ⟦A⟧v βŠ™ ⦅Γ⦆v) βŠ† ⟦C⟧v
ph_bang ⟦A⟧v βŠ™ ⦅Γ⦆v βŠ† ⟦C⟧v
c: bool
A: iformula
P: phase_space
v: nat β†’ propset P

⟦A⟧v βŠ™ one_set βŠ† ⟦A⟧v
c: bool
A: iformula
P: phase_space
v: nat β†’ propset P

one_set βŠ™ ⟦A⟧v βŠ† ⟦A⟧v
apply prod_one_l; [apply interp_fact | done].
c: bool
Ξ“, Ξ”: list iformula
A, C: iformula
H: c = true
H0: Ξ“ ⊒[c] A
H1: A :: Ξ” ⊒[c] C
P: phase_space
v: nat β†’ propset P
IHill1: ⦅Γ⦆v βŠ† ⟦A⟧v
IHill2: ⟦A⟧v βŠ™ ⦅Δ⦆v βŠ† ⟦C⟧v

β¦…Ξ“ ++ Δ⦆v βŠ† ⟦C⟧v
by rewrite ctx_app, IHill1.
c: bool
Ξ“, Ξ“': list iformula
C: iformula
H: Ξ“ β‰‘β‚š Ξ“'
H0: Ξ“ ⊒[c] C
P: phase_space
v: nat β†’ propset P
IHill: ⦅Γ⦆v βŠ† ⟦C⟧v

β¦…Ξ“'⦆v βŠ† ⟦C⟧v
c: bool
Ξ“, Ξ“': list iformula
C: iformula
H: Ξ“ β‰‘β‚š Ξ“'
H0: Ξ“ ⊒[c] C
P: phase_space
v: nat β†’ propset P
IHill: ⦅Γ⦆v βŠ† ⟦C⟧v

β¦…Ξ“'⦆v βŠ† ⦅Γ⦆v
c: bool
Ξ“, Ξ“': list iformula
C: iformula
H: Ξ“ β‰‘β‚š Ξ“'
H0: Ξ“ ⊒[c] C
P: phase_space
v: nat β†’ propset P
IHill: ⦅Γ⦆v βŠ† ⟦C⟧v

Ξ“' β‰‘β‚š Ξ“
by symmetry.
c: bool
P: phase_space
v: nat β†’ propset P

one_set βŠ† ph_one
apply ph_cl_ext.
c: bool
Ξ“: list iformula
C: iformula
H: Ξ“ ⊒[c] C
P: phase_space
v: nat β†’ propset P
IHill: ⦅Γ⦆v βŠ† ⟦C⟧v

ph_one βŠ™ ⦅Γ⦆v βŠ† ⟦C⟧v
apply prod_cl_l, prod_one_l; auto using interp_fact.
c: bool
Ξ“, Ξ”: list iformula
A, B: iformula
H: Ξ“ ⊒[c] A
H0: Ξ” ⊒[c] B
P: phase_space
v: nat β†’ propset P
IHill1: ⦅Γ⦆v βŠ† ⟦A⟧v
IHill2: ⦅Δ⦆v βŠ† ⟦B⟧v

β¦…Ξ“ ++ Δ⦆v βŠ† ph_tensor ⟦A⟧v ⟦B⟧v
c: bool
Ξ“, Ξ”: list iformula
A, B: iformula
H: Ξ“ ⊒[c] A
H0: Ξ” ⊒[c] B
P: phase_space
v: nat β†’ propset P
IHill1: ⦅Γ⦆v βŠ† ⟦A⟧v
IHill2: ⦅Δ⦆v βŠ† ⟦B⟧v

⟦A⟧v βŠ™ ⟦B⟧v βŠ† ph_tensor ⟦A⟧v ⟦B⟧v
apply ph_cl_ext.
c: bool
Ξ“: list iformula
A, B, C: iformula
H: A :: B :: Ξ“ ⊒[c] C
P: phase_space
v: nat β†’ propset P
IHill: ⟦A⟧v βŠ™ (⟦B⟧v βŠ™ ⦅Γ⦆v) βŠ† ⟦C⟧v

ph_tensor ⟦A⟧v ⟦B⟧v βŠ™ ⦅Γ⦆v βŠ† ⟦C⟧v
apply tensor_l; auto using interp_fact.
c: bool
Ξ“: list iformula
A, B: iformula
H: A :: Ξ“ ⊒[c] B
P: phase_space
v: nat β†’ propset P
IHill: ⟦A⟧v βŠ™ ⦅Γ⦆v βŠ† ⟦B⟧v

⦅Γ⦆v βŠ† ph_lolli ⟦A⟧v ⟦B⟧v
c: bool
Ξ“: list iformula
A, B: iformula
H: A :: Ξ“ ⊒[c] B
P: phase_space
v: nat β†’ propset P
IHill: ⟦A⟧v βŠ™ ⦅Γ⦆v βŠ† ⟦B⟧v

⦅Γ⦆v βŠ™ ⟦A⟧v βŠ† ⟦B⟧v
by rewrite prod_comm.
c: bool
Ξ“, Ξ”: list iformula
A, B, C: iformula
H: Ξ“ ⊒[c] A
H0: B :: Ξ” ⊒[c] C
P: phase_space
v: nat β†’ propset P
IHill1: ⦅Γ⦆v βŠ† ⟦A⟧v
IHill2: ⟦B⟧v βŠ™ ⦅Δ⦆v βŠ† ⟦C⟧v

ph_lolli ⟦A⟧v ⟦B⟧v βŠ™ β¦…Ξ“ ++ Δ⦆v βŠ† ⟦C⟧v
by rewrite ctx_app, prod_assoc_l, IHill1, lolli_elim by apply interp_fact.
c: bool
Ξ“: list iformula
A, B: iformula
H: Ξ“ ⊒[c] A
H0: Ξ“ ⊒[c] B
P: phase_space
v: nat β†’ propset P
IHill1: ⦅Γ⦆v βŠ† ⟦A⟧v
IHill2: ⦅Γ⦆v βŠ† ⟦B⟧v

⦅Γ⦆v βŠ† ⟦A⟧v ∩ ⟦B⟧v
set_solver.
c: bool
Ξ“: list iformula
A, B, C: iformula
H: A :: Ξ“ ⊒[c] C
P: phase_space
v: nat β†’ propset P
IHill: ⟦A⟧v βŠ™ ⦅Γ⦆v βŠ† ⟦C⟧v

⟦A⟧v ∩ ⟦B⟧v βŠ™ ⦅Γ⦆v βŠ† ⟦C⟧v
by rewrite intersection_subseteq_l.
c: bool
Ξ“: list iformula
A, B, C: iformula
H: B :: Ξ“ ⊒[c] C
P: phase_space
v: nat β†’ propset P
IHill: ⟦B⟧v βŠ™ ⦅Γ⦆v βŠ† ⟦C⟧v

⟦A⟧v ∩ ⟦B⟧v βŠ™ ⦅Γ⦆v βŠ† ⟦C⟧v
by rewrite intersection_subseteq_r.
c: bool
Ξ“: list iformula
P: phase_space
v: nat β†’ propset P

⦅Γ⦆v βŠ† ph_top
c: bool
Ξ“: list iformula
P: phase_space
v: nat β†’ propset P
m: P

m ∈ ph_top
apply elem_of_top.
c: bool
Ξ“: list iformula
A, B: iformula
H: Ξ“ ⊒[c] A
P: phase_space
v: nat β†’ propset P
IHill: ⦅Γ⦆v βŠ† ⟦A⟧v

⦅Γ⦆v βŠ† ph_plus ⟦A⟧v ⟦B⟧v
c: bool
Ξ“: list iformula
A, B: iformula
H: Ξ“ ⊒[c] A
P: phase_space
v: nat β†’ propset P
IHill: ⦅Γ⦆v βŠ† ⟦A⟧v

⟦A⟧v βŠ† ph_plus ⟦A⟧v ⟦B⟧v
c: bool
Ξ“: list iformula
A, B: iformula
H: Ξ“ ⊒[c] A
P: phase_space
v: nat β†’ propset P
IHill: ⦅Γ⦆v βŠ† ⟦A⟧v

⟦A⟧v βŠ† ⟦A⟧v βˆͺ ⟦B⟧v
set_solver.
c: bool
Ξ“: list iformula
A, B: iformula
H: Ξ“ ⊒[c] B
P: phase_space
v: nat β†’ propset P
IHill: ⦅Γ⦆v βŠ† ⟦B⟧v

⦅Γ⦆v βŠ† ph_plus ⟦A⟧v ⟦B⟧v
c: bool
Ξ“: list iformula
A, B: iformula
H: Ξ“ ⊒[c] B
P: phase_space
v: nat β†’ propset P
IHill: ⦅Γ⦆v βŠ† ⟦B⟧v

⟦B⟧v βŠ† ph_plus ⟦A⟧v ⟦B⟧v
c: bool
Ξ“: list iformula
A, B: iformula
H: Ξ“ ⊒[c] B
P: phase_space
v: nat β†’ propset P
IHill: ⦅Γ⦆v βŠ† ⟦B⟧v

⟦B⟧v βŠ† ⟦A⟧v βˆͺ ⟦B⟧v
set_solver.
c: bool
Ξ“: list iformula
A, B, C: iformula
H: A :: Ξ“ ⊒[c] C
H0: B :: Ξ“ ⊒[c] C
P: phase_space
v: nat β†’ propset P
IHill1: ⟦A⟧v βŠ™ ⦅Γ⦆v βŠ† ⟦C⟧v
IHill2: ⟦B⟧v βŠ™ ⦅Γ⦆v βŠ† ⟦C⟧v

ph_plus ⟦A⟧v ⟦B⟧v βŠ™ ⦅Γ⦆v βŠ† ⟦C⟧v
apply prod_cl_l; [apply interp_fact | set_solver].
c: bool
Ξ“: list iformula
C: iformula
P: phase_space
v: nat β†’ propset P

ph_zero βŠ™ ⦅Γ⦆v βŠ† ⟦C⟧v
apply prod_cl_l; [apply interp_fact | set_solver].
c: bool
Ξ£: list iformula
A: iformula
H: β€ΌΞ£ ⊒[c] A
P: phase_space
v: nat β†’ propset P
IHill: ⦅‼Σ⦆v βŠ† ⟦A⟧v

⦅‼Σ⦆v βŠ† ph_bang ⟦A⟧v
c: bool
Ξ£: list iformula
A: iformula
H: β€ΌΞ£ ⊒[c] A
P: phase_space
v: nat β†’ propset P
IHill: ⦅‼Σ⦆v βŠ† ⟦A⟧v

cl (⦅‼Σ⦆v ∩ J) βŠ† ph_bang ⟦A⟧v
c: bool
Ξ£: list iformula
A: iformula
H: β€ΌΞ£ ⊒[c] A
P: phase_space
v: nat β†’ propset P
IHill: ⦅‼Σ⦆v βŠ† ⟦A⟧v

⦅‼Σ⦆v ∩ J βŠ† ⟦A⟧v ∩ J
set_solver.
c: bool
Ξ“: list iformula
A, C: iformula
H: A :: Ξ“ ⊒[c] C
P: phase_space
v: nat β†’ propset P
IHill: ⟦A⟧v βŠ™ ⦅Γ⦆v βŠ† ⟦C⟧v

ph_bang ⟦A⟧v βŠ™ ⦅Γ⦆v βŠ† ⟦C⟧v
c: bool
Ξ“: list iformula
A, C: iformula
H: A :: Ξ“ ⊒[c] C
P: phase_space
v: nat β†’ propset P
IHill: ⟦A⟧v βŠ™ ⦅Γ⦆v βŠ† ⟦C⟧v

⟦A⟧v ∩ J βŠ™ ⦅Γ⦆v βŠ† ⟦C⟧v
by rewrite intersection_subseteq_l.
c: bool
Ξ“: list iformula
A, C: iformula
H: Ξ“ ⊒[c] C
P: phase_space
v: nat β†’ propset P
IHill: ⦅Γ⦆v βŠ† ⟦C⟧v

ph_bang ⟦A⟧v βŠ™ ⦅Γ⦆v βŠ† ⟦C⟧v
c: bool
Ξ“: list iformula
A, C: iformula
H: Ξ“ ⊒[c] C
P: phase_space
v: nat β†’ propset P
IHill: ⦅Γ⦆v βŠ† ⟦C⟧v

ph_one βŠ™ ⦅Γ⦆v βŠ† ⟦C⟧v
apply prod_cl_l, prod_one_l; auto using interp_fact.
c: bool
Ξ“: list iformula
A, C: iformula
H: !A :: !A :: Ξ“ ⊒[c] C
P: phase_space
v: nat β†’ propset P
IHill: ph_bang ⟦A⟧v βŠ™ (ph_bang ⟦A⟧v βŠ™ ⦅Γ⦆v) βŠ† ⟦C⟧v

ph_bang ⟦A⟧v βŠ™ ⦅Γ⦆v βŠ† ⟦C⟧v
c: bool
Ξ“: list iformula
A, C: iformula
H: !A :: !A :: Ξ“ ⊒[c] C
P: phase_space
v: nat β†’ propset P
IHill: ph_bang ⟦A⟧v βŠ™ (ph_bang ⟦A⟧v βŠ™ ⦅Γ⦆v) βŠ† ⟦C⟧v

ph_tensor (ph_bang ⟦A⟧v) (ph_bang ⟦A⟧v) βŠ™ ⦅Γ⦆v βŠ† ⟦C⟧v
apply tensor_l; auto using interp_fact. Qed.

Using the semantics: what ILL cannot prove

Soundness gives a way to show that a sequent is not derivable: find a phase space in which it fails. One small phase space is enough for every example below:
Each variable $p denotes {1}, one unit of resource.

phase_space

phase_space

βˆ€ x y z : nat, x + (y + z) ≑ x + y + z

βˆ€ x y : nat, x + y ≑ y + x

βˆ€ x : nat, 0 + x ≑ x

βˆ€ X : propset nat, X βŠ† X

βˆ€ X Y : propset nat, X βŠ† Y β†’ X βŠ† Y

βˆ€ (X : propset nat) (x y : nat), x ≑ y β†’ x ∈ X β†’ y ∈ X

βˆ€ (X Y : propset nat) (x y : nat), x ∈ X β†’ y ∈ Y β†’ x + y ∈ prod_with equiv Nat.add X Y

βˆ€ x y : nat, x ≑ y β†’ x ∈ {[ n | n = 0 ]} β†’ y ∈ {[ n | n = 0 ]}

0 ∈ {[ n | n = 0 ]}

βˆ€ x y : nat, x ∈ {[ n | n = 0 ]} β†’ y ∈ {[ n | n = 0 ]} β†’ x + y ∈ {[ n | n = 0 ]}

βˆ€ x : nat, x ∈ {[ n | n = 0 ]} β†’ x ∈ {[ z | z ≑ 0 ]}

βˆ€ x : nat, x ∈ {[ n | n = 0 ]} β†’ x ∈ {[ z | z ≑ x + x ]}
(* the monoid laws are arithmetic; the closure laws are trivial since cl is the identity *) all: try apply _; intros; unfold equiv, prod_with in *; set_unfold; naive_solver lia. Defined. Definition one_each : nat -> propset counting_space := Ξ» _, {[ n | n = 1 ]}.
In counting_space, every set membership reduces to arithmetic. count unfolds the definitions and leaves the arithmetic behind. set_unfold can expose new redexes of interp, so it runs a few rounds.
Ltac count_unfold :=
  cbn [interp interp_ctx counting_space carrier ph_cl ph_op ph_e
       ph_J ph_bot ph_equiv] in *;
  unfold ph_one, ph_tensor, ph_plus, ph_zero, ph_bang, one_each, equiv in *.
Ltac count := do 3 (count_unfold; set_unfold).

Ξ“: list iformula
A: iformula

Ξ“ ⊒ A β†’ βˆ€ m : counting_space, m ∈ ⦅Γ⦆one_each β†’ m ∈ ⟦A⟧one_each
Ξ“: list iformula
A: iformula

Ξ“ ⊒ A β†’ βˆ€ m : counting_space, m ∈ ⦅Γ⦆one_each β†’ m ∈ ⟦A⟧one_each
Ξ“: list iformula
A: iformula
H: Ξ“ ⊒ A

βˆ€ m : counting_space, m ∈ ⦅Γ⦆one_each β†’ m ∈ ⟦A⟧one_each
exact (soundness _ _ _ H counting_space one_each). Qed.
Every refutation below has the same shape: name a bag m that is in ⦅Γ⦆ but not in ⟦A⟧. After count, both conditions are statements about natural numbers.
m: counting_space
Ξ“: list iformula
A: iformula

m ∈ ⦅Γ⦆one_each β†’ m βˆ‰ ⟦A⟧one_each β†’ Β¬ (Ξ“ ⊒ A)
m: counting_space
Ξ“: list iformula
A: iformula

m ∈ ⦅Γ⦆one_each β†’ m βˆ‰ ⟦A⟧one_each β†’ Β¬ (Ξ“ ⊒ A)
m: counting_space
Ξ“: list iformula
A: iformula
Hm: m ∈ ⦅Γ⦆one_each
HA: m βˆ‰ ⟦A⟧one_each
H: Ξ“ ⊒ A

False
by apply HA, (counting_sound H). Qed.
No contraction: one A does not give two. The bag 1 is not 2.

Β¬ ([$0] ⊒ $0 βŠ— $0)

Β¬ ([$0] ⊒ $0 βŠ— $0)
apply (counting_refute 1); count; naive_solver lia. Qed.
No weakening: a hypothesis cannot be ignored. The bag 2 is not 1.

¬ ([$0; $1] ⊒ $0)

¬ ([$0; $1] ⊒ $0)
apply (counting_refute 2); count; naive_solver lia. Qed.
No free lunch: one euro buys a coffee or a tea, never both.

Β¬ ([euro] ⊒ coffee βŠ— tea)

Β¬ ([euro] ⊒ coffee βŠ— tea)

Β¬ ([$0] ⊒ $1 βŠ— $2)
apply (counting_refute 1); count; naive_solver lia. Qed.
& is not βŠ—: a choice of A or B does not give both.

Β¬ ([$0 & $1] ⊒ $0 βŠ— $1)

Β¬ ([$0 & $1] ⊒ $0 βŠ— $1)
apply (counting_refute 1); count; naive_solver lia. Qed.
A single resource cannot be promoted to an unlimited supply. The bag 1 is not reusable.

¬ ([$0] ⊒ !$0)

¬ ([$0] ⊒ !$0)
apply (counting_refute 1); count; naive_solver lia. Qed.
Consistency: 𝟘 cannot be proved from nothing. ⟦𝟘⟧ = βˆ….

¬ ([] ⊒ 𝟘)

¬ ([] ⊒ 𝟘)
apply (counting_refute 0); count; naive_solver lia. Qed.
The same facts, stated as implications with no hypotheses. In Types/CurryHoward.v they become statements about which programs exist. The empty bag 0 does not turn 1 into 2, nor 2 into 1.

Β¬ ([] ⊒ $0 ⊸ $0 βŠ— $0)

Β¬ ([] ⊒ $0 ⊸ $0 βŠ— $0)
apply (counting_refute 0); count; naive_solver lia. Qed.

Β¬ ([] ⊒ $0 βŠ— $1 ⊸ $0)

Β¬ ([] ⊒ $0 βŠ— $1 ⊸ $0)

Β¬ βˆ€ x : nat, (βˆƒ x0 x1 : nat, x0 = 1 ∧ x1 = 1 ∧ x = x0 + x1) β†’ x = 1
H: βˆ€ x : nat, (βˆƒ x0 x1 : nat, x0 = 1 ∧ x1 = 1 ∧ x = x0 + x1) β†’ x = 1

False
H: βˆ€ x : nat, (βˆƒ x0 x1 : nat, x0 = 1 ∧ x1 = 1 ∧ x = x0 + x1) β†’ x = 1

2 = 1
H: βˆ€ x : nat, (βˆƒ x0 x1 : nat, x0 = 1 ∧ x1 = 1 ∧ x = x0 + x1) β†’ x = 1

βˆƒ x x0 : nat, x = 1 ∧ x0 = 1 ∧ 2 = x + x0
by exists 1, 1. Qed.
Double-negation elimination fails in ILL. With βŠ₯ = βˆ…, the set ∼$0 = $0 ⊸ βŠ₯ is empty, so ∼∼$0 holds of every bag, including bags that are not {1}, such as 5. Comparison.v contrasts this with CLL, where ∼∼A ⊒ A is provable.

¬ ([∼∼$0] ⊒ $0)

¬ ([∼∼$0] ⊒ $0)

βˆƒ x x0 : nat, (nat β†’ (βˆ€ x1 : nat, x1 = 1 β†’ False) β†’ False) ∧ x0 = 0 ∧ 5 = x + x0

(nat β†’ (βˆ€ x : nat, x = 1 β†’ False) β†’ False) ∧ 0 = 0 ∧ 5 = 5 + 0

nat β†’ (βˆ€ x : nat, x = 1 β†’ False) β†’ False
Hf: βˆ€ x : nat, x = 1 β†’ False

False
by apply (Hf 1). Qed.