Intuitionistic.Phase: phase semantics and soundness for ILL
- a phase is an element of a commutative monoid (M, Β·, Ξ΅). Think of it as a bag of resources, with Β· putting two bags together;
- a formula denotes a set of phases: the bags of resources that are enough to produce it;
- a sequent Aβ, β¦, Aβ β’ C is valid when combining one bag from each Aα΅’ always gives a bag in C.
- phase spaces, with sets taken from stdpp's propset;
- the interpretation of formulas and sequents;
- soundness: Ξ β’[c] C β Ξ β¨ C;
- countermodels: ILL has neither contraction nor weakening.
From LinearLogic.Intuitionistic Require Export Sequent.
Phase spaces
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) ]}.- a commutative monoid (M, Β·, Ξ΅), commutative only up to an equivalence β‘. The syntactic model of CutElim.v uses lists up to permutation, so equality would be too strict. We use stdpp's Equiv class and Proper instances, so rewrite works under β‘;
- a closure operator cl on propset M that is stable: cl X β cl Y β cl (X β Y);
- a set J of reusable phases. J contains Ξ΅ and is closed under Β·, and each j β J can be discarded (j β cl {Ξ΅}) and duplicated (j β cl {j Β· j}). J is the semantic shadow of !;
- a set ph_bot. Its closure interprets the constant β₯.
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.
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: Pz β one_set β z β‘ Ξ΅P: phase_space
z: Pz β one_set β z β‘ Ξ΅by rewrite elem_of_PropSet. Qed.P: phase_space
z: Pz β {[ z0 | z0 β‘ Ξ΅ ]} β z β‘ Ξ΅P: phase_space
X, Y: propset P
z: Pz β X β Y β β a b : P, a β X β§ b β Y β§ z β‘ a Β· bP: phase_space
X, Y: propset P
z: Pz β X β Y β β a b : P, a β X β§ b β Y β§ z β‘ a Β· bby rewrite elem_of_PropSet. Qed.P: phase_space
X, Y: propset P
z: Pz β {[ z0 | β a b : P, a β X β§ b β Y β§ z0 β‘ a Β· b ]} β β a b : P, a β X β§ b β Y β§ z β‘ a Β· bP: phase_space
z: PSetUnfoldElemOf z one_set (z β‘ Ξ΅)P: phase_space
z: PSetUnfoldElemOf z one_set (z β‘ Ξ΅)apply elem_of_one. Qed.P: phase_space
z: Pz β one_set β z β‘ Ξ΅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 Β· bP: 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 Β· bby setoid_rewrite (Ξ» b, @set_unfold_elem_of _ _ _ b Y (R b) (HY b)). Qed. End elem_of.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
Facts and the algebra of sets of phases
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 PX β Y β cl X β cl YP: phase_space
X, Y: propset PX β Y β cl X β cl YP: phase_space
X, Y: propset P
H: X β Ycl X β cl YP: phase_space
X, Y: propset P
H: X β YX β cl Yapply ph_cl_ext, H, Hx. Qed.P: phase_space
X, Y: propset P
H: X β Y
x: P
Hx: x β Xx β cl YP: phase_spaceProper (subseteq ==> subseteq) clP: phase_spaceProper (subseteq ==> subseteq) clapply cl_mono. Qed.P: phase_space
X, Y: propset PX β Y β cl X β cl Y
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 Pfact (cl X)P: phase_space
X: propset Pfact (cl X)done. Qed.P: phase_space
X: propset Pcl X β cl X
Facts are closed under β‘.
P: phase_space
F: propset P
x, y: Pfact F β x β‘ y β x β F β y β FP: phase_space
F: propset P
x, y: Pfact F β x β‘ y β x β F β y β FP: phase_space
F: propset P
x, y: P
HF: fact F
Hxy: x β‘ y
Hx: x β Fy β Fby apply ph_cl_ext. Qed.P: phase_space
F: propset P
x, y: P
HF: fact F
Hxy: x β‘ y
Hx: x β Fx β cl F
cl X is the least fact containing X.
P: phase_space
X, F: propset Pfact F β X β F β cl X β FP: phase_space
X, F: propset Pfact F β X β F β cl X β Fby rewrite H. Qed.P: phase_space
X, F: propset P
HF: fact F
H: X β Fcl X β F
Products
P: phase_space
X, X', Y, Y': propset PX β X' β Y β Y' β X β Y β X' β Y'set_solver. Qed.P: phase_space
X, X', Y, Y': propset PX β X' β Y β Y' β X β Y β X' β Y'P: phase_spaceProper (subseteq ==> subseteq ==> subseteq) prod_setP: phase_spaceProper (subseteq ==> subseteq ==> subseteq) prod_setby apply prod_mono. Qed.P: phase_space
X, X': propset P
HX: X β X'
Y, Y': propset P
HY: Y β Y'X β Y β X' β Y'P: phase_space
X, Y: propset PX β Y β Y β XP: phase_space
X, Y: propset PX β Y β Y β XP: phase_space
X, Y: propset P
m, a, b: P
Ha: a β X
Hb: b β Y
Hm: m β‘ a Β· bm β Y β XP: 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 Β· b0by rewrite Hm, ph_comm. Qed.P: phase_space
X, Y: propset P
m, a, b: P
Ha: a β X
Hb: b β Y
Hm: m β‘ a Β· bb β Y β§ a β X β§ m β‘ b Β· aP: phase_space
X, Y, Z: propset PX β (Y β Z) β X β Y β ZP: phase_space
X, Y, Z: propset PX β (Y β Z) β X β Y β ZP: 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 Β· nm β X β Y β ZP: 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 Β· b0P: 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 Β· na Β· b β X β Y β§ c β Z β§ m β‘ a Β· b Β· cP: 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 Β· na Β· b β X β YP: 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 Β· nm β‘ a Β· b Β· cP: 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 Β· na Β· b β X β Yby 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β a0 b0 : P, a0 β X β§ b0 β Y β§ a Β· b β‘ a0 Β· b0by rewrite Hm, Hn, ph_assoc. Qed.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 Β· nm β‘ a Β· b Β· cP: phase_space
X, Y, Z: propset PX β Y β Z β X β (Y β Z)P: phase_space
X, Y, Z: propset PX β 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 Β· cm β 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 Β· b0P: 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 Β· ca β 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 Β· cb Β· c β Y β ZP: 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 Β· cm β‘ 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 Β· cb Β· c β Y β Zby 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β a0 b0 : P, a0 β Y β§ b0 β Z β§ b Β· c β‘ a0 Β· b0by rewrite Hm, Hn, ph_assoc. Qed.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 Β· cm β‘ a Β· (b Β· c)P: phase_space
X: propset PX β one_set β XP: phase_space
X: propset PX β one_set β XP: phase_space
X: propset P
x: P
Hx: x β Xx β one_set β XP: phase_space
X: propset P
x: P
Hx: x β Xβ a b : P, a β one_set β§ b β X β§ x β‘ a Β· bby rewrite elem_of_one, ph_unit_l. Qed.P: phase_space
X: propset P
x: P
Hx: x β XΞ΅ β one_set β§ x β X β§ x β‘ Ξ΅ Β· x
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 Pfact F β X β F β one_set β X β FP: phase_space
X, F: propset Pfact F β X β F β one_set β X β FP: phase_space
X, F: propset P
HF: fact F
HX: X β F
m, e, x: P
He: e β‘ Ξ΅
Hx: x β X
Hm: m β‘ e Β· xm β Fby rewrite Hm, He, ph_unit_l. Qed.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 Β· xx β‘ m
The stability axiom of the record, stated for sets.
P: phase_space
X, Y: propset Pcl X β cl Y β cl (X β Y)P: phase_space
X, Y: propset Pcl 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 Β· ym β cl (X β Y)by apply ph_cl_stable. Qed.P: phase_space
X, Y: propset P
m, x, y: P
Hx: x β cl X
Hy: y β cl Y
Hm: m β‘ x Β· yx Β· y β cl (X β Y)
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 Pfact F β X β G β F β cl X β G β FP: phase_space
X, G, F: propset Pfact F β X β G β F β cl X β G β FP: phase_space
X, G, F: propset P
HF: fact F
H: X β G β Fcl X β G β Fby apply cl_least_fact. Qed.P: phase_space
X, G, F: propset P
HF: fact F
H: X β G β Fcl (X β G) β F
The phase connectives
π β¦ 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)
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: Pm β ph_lolli X Y β β a : P, a β X β m Β· a β YP: phase_space
X, Y: propset P
m: Pm β ph_lolli X Y β β a : P, a β X β m Β· a β Yby rewrite elem_of_PropSet. Qed.P: phase_space
X, Y: propset P
m: Pm β {[ m0 | β a : P, a β X β m0 Β· a β Y ]} β β a : P, a β X β m Β· a β YP: phase_space
m: Pm β ph_topP: phase_space
m: Pm β ph_topby rewrite elem_of_PropSet. Qed.P: phase_space
m: Pm β {[ _ | True ]}P: phase_space
X, Y: propset P
m: PSetUnfoldElemOf m (ph_lolli X Y) (β a : P, a β X β m Β· a β Y)P: phase_space
X, Y: propset P
m: PSetUnfoldElemOf m (ph_lolli X Y) (β a : P, a β X β m Β· a β Y)apply elem_of_lolli. Qed.P: phase_space
X, Y: propset P
m: Pm β ph_lolli X Y β β a : P, a β X β m Β· a β YP: phase_space
m: PSetUnfoldElemOf m ph_top TrueP: phase_space
m: PSetUnfoldElemOf m ph_top Truesplit; [done | intros; apply elem_of_top]. Qed.P: phase_space
m: Pm β ph_top β True
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 PG β X β Y β G β ph_lolli X YP: phase_space
X, Y, G: propset PG β X β Y β G β ph_lolli X YP: phase_space
X, Y, G: propset P
H: G β X β Y
m: P
Hm: m β Gm β ph_lolli X YP: phase_space
X, Y, G: propset P
H: G β X β Y
m: P
Hm: m β Gβ a : P, a β X β m Β· a β YP: phase_space
X, Y, G: propset P
H: G β X β Y
m: P
Hm: m β G
a: P
Ha: a β Xm Β· a β Yby exists m, a. Qed.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 Β· bP: phase_space
X, Y: propset Pfact Y β ph_lolli X Y β X β YP: phase_space
X, Y: propset Pfact Y β ph_lolli X Y β X β YP: 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 Β· am β YP: 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 Β· af Β· a β Yby apply Hf. Qed.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 Β· af Β· a β YP: phase_space
X, Y: propset Pfact Y β fact (ph_lolli X Y)P: phase_space
X, Y: propset Pfact Y β fact (ph_lolli X Y)apply lolli_intro, prod_cl_l, lolli_elim; done. Qed.P: phase_space
X, Y: propset P
HY: fact Yfact (ph_lolli X Y)P: phase_space
X, Y: propset Pfact X β fact Y β fact (X β© Y)P: phase_space
X, Y: propset Pfact 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 β© Ysplit; [apply HX | apply HY]; revert m Hm; apply cl_mono; set_solver. Qed.P: phase_space
X, Y: propset P
HX: fact X
HY: fact Y
m: P
Hm: m β cl (X β© Y)m β X β§ m β YP: phase_spacefact ph_topP: phase_spacefact ph_topapply elem_of_top. Qed.P: phase_space
m: Pm β ph_top
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 Pfact F β X β (Y β G) β F β ph_tensor X Y β G β FP: phase_space
X, Y, G, F: propset Pfact F β X β (Y β G) β F β ph_tensor X Y β G β FP: phase_space
X, Y, G, F: propset P
HF: fact F
H: X β (Y β G) β Fph_tensor X Y β G β Fby rewrite prod_assoc_r. Qed.P: phase_space
X, Y, G, F: propset P
HF: fact F
H: X β (Y β G) β FX β Y β G β F
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 Pph_bang X β ph_oneP: phase_space
X: propset Pph_bang X β ph_oneP: phase_space
X: propset PX β© J β cl one_setby apply ph_J_weak. Qed.P: phase_space
X: propset P
j: P
HJ: j β Jj β cl one_setP: phase_space
X: propset Pph_bang X β ph_tensor (ph_bang X) (ph_bang X)P: phase_space
X: propset Pph_bang X β ph_tensor (ph_bang X) (ph_bang X)P: phase_space
X: propset PX β© J β cl (ph_bang X β ph_bang X)P: phase_space
X: propset P
j: P
Hj: j β X β© Jj β cl (ph_bang X β ph_bang X)P: phase_space
X: propset P
j: P
Hj: j β X β© Jj β cl (X β© J β (X β© J))P: phase_space
X: propset P
j: P
Hj: j β X β© Jj β cl {[ z | z β‘ j Β· j ]}set_solver. Qed. End Facts.P: phase_space
X: propset P
j: P
Hj: j β X β© Jj β J
Interpreting formulas and sequents
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: iformulafact β¦Aβ§vinduction 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.P: phase_space
v: nat β propset P
A: iformulafact β¦Aβ§v
Split a bag for Ξ ++ Ξ into a bag for Ξ and a bag for Ξ.
P: phase_space
v: nat β propset P
Ξ, Ξ: list iformulaβ¦ Ξ ++ Ξβ¦v β β¦ Ξβ¦v β β¦ Ξβ¦vP: phase_space
v: nat β propset P
Ξ, Ξ: list iformulaβ¦ Ξ ++ Ξβ¦v β β¦ Ξβ¦v β β¦ Ξβ¦vP: phase_space
v: nat β propset P
Ξ: list iformulaβ¦ Ξβ¦v β one_set β β¦ Ξβ¦vP: phase_space
v: nat β propset P
A: iformula
Ξ, Ξ: list iformula
IH: β¦ Ξ ++ Ξβ¦v β β¦ Ξβ¦v β β¦ Ξβ¦vβ¦Aβ§v β β¦ Ξ ++ Ξβ¦v β β¦Aβ§v β β¦ Ξβ¦v β β¦ Ξβ¦vapply prod_unit_l.P: phase_space
v: nat β propset P
Ξ: list iformulaβ¦ Ξβ¦v β one_set β β¦ Ξβ¦vby rewrite IH, prod_assoc_l. Qed.P: phase_space
v: nat β propset P
A: iformula
Ξ, Ξ: list iformula
IH: β¦ Ξ ++ Ξβ¦v β β¦ Ξβ¦v β β¦ Ξβ¦vβ¦Aβ§v β β¦ Ξ ++ Ξβ¦v β β¦Aβ§v β β¦ Ξβ¦v β β¦ Ξβ¦v
Β· 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 β β¦ Ξ'β¦vP: phase_space
v: nat β propset P
Ξ, Ξ': list iformulaΞ β‘β Ξ' β β¦ Ξβ¦v β β¦ Ξ'β¦vP: phase_space
v: nat β propset Pone_set β one_setP: phase_space
v: nat β propset P
A: iformula
Ξ, Ξ': list iformula
IH: β¦ Ξβ¦v β β¦ Ξ'β¦vβ¦Aβ§v β β¦ Ξβ¦v β β¦Aβ§v β β¦ Ξ'β¦vP: 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 β β¦ Ξ''β¦vdone.P: phase_space
v: nat β propset Pone_set β one_setby rewrite IH.P: phase_space
v: nat β propset P
A: iformula
Ξ, Ξ': list iformula
IH: β¦ Ξβ¦v β β¦ Ξ'β¦vβ¦Aβ§v β β¦ Ξβ¦v β β¦Aβ§v β β¦ Ξ'β¦vby rewrite prod_assoc_l, (prod_comm (β¦Bβ§v)), prod_assoc_r.P: phase_space
v: nat β propset P
A, B: iformula
Ξ: list iformulaβ¦Bβ§v β (β¦Aβ§v β β¦ Ξβ¦v) β β¦Aβ§v β (β¦Bβ§v β β¦ Ξβ¦v)by rewrite IH1, IH2. Qed.P: phase_space
v: nat β propset P
Ξ, Ξ', Ξ'': list iformula
IH1: β¦ Ξβ¦v β β¦ Ξ'β¦v
IH2: β¦ Ξ'β¦v β β¦ Ξ''β¦vβ¦ Ξβ¦v β β¦ Ξ''β¦v
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 Pone_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 Pone_set β cl (one_set β© J)P: phase_space
v: nat β propset P
m: P
Hm: m β one_setm β cl (one_set β© J)P: phase_space
v: nat β propset P
m: P
Hm: m β one_setm β one_set β§ m β JP: phase_space
v: nat β propset P
m: P
Hm: m β one_setm β Japply (ph_J_proper Ξ΅); [by symmetry | apply ph_J_unit].P: phase_space
v: nat β propset P
m: P
Hm: m β‘ Ξ΅m β JP: 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) β© JP: 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 Β· gm β (cl (β¦Aβ§v β© J) β β¦ βΌΞ£β¦v) β© JP: 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 Β· gm β cl (β¦Aβ§v β© J) β β¦ βΌΞ£β¦v β§ m β JP: 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 Β· gm β cl (β¦Aβ§v β© J) β β¦ βΌΞ£β¦vP: 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 Β· gm β JP: 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 Β· gm β cl (β¦Aβ§v β© J) β β¦ βΌΞ£β¦vP: 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 Β· bsplit_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 Β· ga β cl (β¦Aβ§v β© J) β§ g β β¦ βΌΞ£β¦v β§ m β‘ a Β· gapply (ph_J_proper (a Β· g)); [by symmetry | by apply ph_J_op]. Qed. End Interp.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 Β· gm β J
Soundness
c: bool
Ξ: list iformula
A: iformulaΞ β’[c] A β Ξ β¨ Ac: bool
Ξ: list iformula
A: iformulaΞ β’[c] A β Ξ β¨ Ac: bool
Ξ: list iformula
A: iformula
H: Ξ β’[c] A
P: phase_space
v: nat β propset Pvalid_in v Ξ Ac: bool
A: iformula
P: phase_space
v: nat β propset Pβ¦Aβ§v β one_set β β¦Aβ§vc: 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β§vc: bool
Ξ, Ξ': list iformula
C: iformula
H: Ξ β‘β Ξ'
H0: Ξ β’[c] C
P: phase_space
v: nat β propset P
IHill: β¦ Ξβ¦v β β¦Cβ§vβ¦ Ξ'β¦v β β¦Cβ§vc: bool
P: phase_space
v: nat β propset Pone_set β ph_onec: bool
Ξ: list iformula
C: iformula
H: Ξ β’[c] C
P: phase_space
v: nat β propset P
IHill: β¦ Ξβ¦v β β¦Cβ§vph_one β β¦ Ξβ¦v β β¦Cβ§vc: 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β§vc: 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β§vph_tensor β¦Aβ§v β¦Bβ§v β β¦ Ξβ¦v β β¦Cβ§vc: 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β§vc: 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β§vph_lolli β¦Aβ§v β¦Bβ§v β β¦ Ξ ++ Ξβ¦v β β¦Cβ§vc: 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β§vc: 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β§vc: 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β§vc: bool
Ξ: list iformula
P: phase_space
v: nat β propset Pβ¦ Ξβ¦v β ph_topc: 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β§vc: 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β§vc: 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β§vph_plus β¦Aβ§v β¦Bβ§v β β¦ Ξβ¦v β β¦Cβ§vc: bool
Ξ: list iformula
C: iformula
P: phase_space
v: nat β propset Pph_zero β β¦ Ξβ¦v β β¦Cβ§vc: bool
Ξ£: list iformula
A: iformula
H: βΌΞ£ β’[c] A
P: phase_space
v: nat β propset P
IHill: β¦ βΌΞ£β¦v β β¦Aβ§vβ¦ βΌΞ£β¦v β ph_bang β¦Aβ§vc: bool
Ξ: list iformula
A, C: iformula
H: A :: Ξ β’[c] C
P: phase_space
v: nat β propset P
IHill: β¦Aβ§v β β¦ Ξβ¦v β β¦Cβ§vph_bang β¦Aβ§v β β¦ Ξβ¦v β β¦Cβ§vc: bool
Ξ: list iformula
A, C: iformula
H: Ξ β’[c] C
P: phase_space
v: nat β propset P
IHill: β¦ Ξβ¦v β β¦Cβ§vph_bang β¦Aβ§v β β¦ Ξβ¦v β β¦Cβ§vc: 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β§vph_bang β¦Aβ§v β β¦ Ξβ¦v β β¦Cβ§vc: bool
A: iformula
P: phase_space
v: nat β propset Pβ¦Aβ§v β one_set β β¦Aβ§vapply prod_one_l; [apply interp_fact | done].c: bool
A: iformula
P: phase_space
v: nat β propset Pone_set β β¦Aβ§v β β¦Aβ§vby rewrite ctx_app, IHill1.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β§vc: bool
Ξ, Ξ': list iformula
C: iformula
H: Ξ β‘β Ξ'
H0: Ξ β’[c] C
P: phase_space
v: nat β propset P
IHill: β¦ Ξβ¦v β β¦Cβ§vβ¦ Ξ'β¦v β β¦Cβ§vc: bool
Ξ, Ξ': list iformula
C: iformula
H: Ξ β‘β Ξ'
H0: Ξ β’[c] C
P: phase_space
v: nat β propset P
IHill: β¦ Ξβ¦v β β¦Cβ§vβ¦ Ξ'β¦v β β¦ Ξβ¦vby symmetry.c: bool
Ξ, Ξ': list iformula
C: iformula
H: Ξ β‘β Ξ'
H0: Ξ β’[c] C
P: phase_space
v: nat β propset P
IHill: β¦ Ξβ¦v β β¦Cβ§vΞ' β‘β Ξapply ph_cl_ext.c: bool
P: phase_space
v: nat β propset Pone_set β ph_oneapply prod_cl_l, prod_one_l; auto using interp_fact.c: bool
Ξ: list iformula
C: iformula
H: Ξ β’[c] C
P: phase_space
v: nat β propset P
IHill: β¦ Ξβ¦v β β¦Cβ§vph_one β β¦ Ξβ¦v β β¦Cβ§vc: 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β§vapply ph_cl_ext.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β§vapply tensor_l; auto using interp_fact.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β§vph_tensor β¦Aβ§v β¦Bβ§v β β¦ Ξβ¦v β β¦Cβ§vc: 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β§vby rewrite prod_comm.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β§vby rewrite ctx_app, prod_assoc_l, IHill1, lolli_elim by apply interp_fact.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β§vph_lolli β¦Aβ§v β¦Bβ§v β β¦ Ξ ++ Ξβ¦v β β¦Cβ§vset_solver.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β§vby rewrite intersection_subseteq_l.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β§vby rewrite intersection_subseteq_r.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β§vc: bool
Ξ: list iformula
P: phase_space
v: nat β propset Pβ¦ Ξβ¦v β ph_topapply elem_of_top.c: bool
Ξ: list iformula
P: phase_space
v: nat β propset P
m: Pm β ph_topc: 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β§vc: 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β§vset_solver.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β§vc: 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β§vc: 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β§vset_solver.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β§vapply prod_cl_l; [apply interp_fact | 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β§vph_plus β¦Aβ§v β¦Bβ§v β β¦ Ξβ¦v β β¦Cβ§vapply prod_cl_l; [apply interp_fact | set_solver].c: bool
Ξ: list iformula
C: iformula
P: phase_space
v: nat β propset Pph_zero β β¦ Ξβ¦v β β¦Cβ§vc: bool
Ξ£: list iformula
A: iformula
H: βΌΞ£ β’[c] A
P: phase_space
v: nat β propset P
IHill: β¦ βΌΞ£β¦v β β¦Aβ§vβ¦ βΌΞ£β¦v β ph_bang β¦Aβ§vc: bool
Ξ£: list iformula
A: iformula
H: βΌΞ£ β’[c] A
P: phase_space
v: nat β propset P
IHill: β¦ βΌΞ£β¦v β β¦Aβ§vcl (β¦ βΌΞ£β¦v β© J) β ph_bang β¦Aβ§vset_solver.c: bool
Ξ£: list iformula
A: iformula
H: βΌΞ£ β’[c] A
P: phase_space
v: nat β propset P
IHill: β¦ βΌΞ£β¦v β β¦Aβ§vβ¦ βΌΞ£β¦v β© J β β¦Aβ§v β© Jc: bool
Ξ: list iformula
A, C: iformula
H: A :: Ξ β’[c] C
P: phase_space
v: nat β propset P
IHill: β¦Aβ§v β β¦ Ξβ¦v β β¦Cβ§vph_bang β¦Aβ§v β β¦ Ξβ¦v β β¦Cβ§vby rewrite intersection_subseteq_l.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β§vc: bool
Ξ: list iformula
A, C: iformula
H: Ξ β’[c] C
P: phase_space
v: nat β propset P
IHill: β¦ Ξβ¦v β β¦Cβ§vph_bang β¦Aβ§v β β¦ Ξβ¦v β β¦Cβ§vapply prod_cl_l, prod_one_l; auto using interp_fact.c: bool
Ξ: list iformula
A, C: iformula
H: Ξ β’[c] C
P: phase_space
v: nat β propset P
IHill: β¦ Ξβ¦v β β¦Cβ§vph_one β β¦ Ξβ¦v β β¦Cβ§vc: 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β§vph_bang β¦Aβ§v β β¦ Ξβ¦v β β¦Cβ§vapply tensor_l; auto using interp_fact. Qed.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β§vph_tensor (ph_bang β¦Aβ§v) (ph_bang β¦Aβ§v) β β¦ Ξβ¦v β β¦Cβ§v
Using the semantics: what ILL cannot prove
- phases are natural numbers, counting how many resources a bag holds;
- Β· is + and Ξ΅ is 0;
- cl is the identity, so every set is a fact;
- the reusable phases are J = {0}: only the empty bag is free to copy or drop;
- β₯ denotes β .
phase_spacephase_space(* 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 ]}.β 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 ]}
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_eachexact (soundness _ _ _ H counting_space one_each). Qed.Ξ: list iformula
A: iformula
H: Ξ β’ Aβ m : counting_space, m β β¦ Ξβ¦one_each β m β β¦Aβ§one_each
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: iformulam β β¦ Ξβ¦one_each β m β β¦Aβ§one_each β Β¬ (Ξ β’ A)m: counting_space
Ξ: list iformula
A: iformulam β β¦ Ξβ¦one_each β m β β¦Aβ§one_each β Β¬ (Ξ β’ A)by apply HA, (counting_sound H). Qed.m: counting_space
Ξ: list iformula
A: iformula
Hm: m β β¦ Ξβ¦one_each
HA: m β β¦Aβ§one_each
H: Ξ β’ AFalse
No contraction: one A does not give two. The bag 1 is not 2.
Β¬ ([$0] β’ $0 β $0)apply (counting_refute 1); count; naive_solver lia. Qed.Β¬ ([$0] β’ $0 β $0)
No weakening: a hypothesis cannot be ignored. The bag 2 is not
1.
Β¬ ([$0; $1] β’ $0)apply (counting_refute 2); count; naive_solver lia. Qed.Β¬ ([$0; $1] β’ $0)
No free lunch: one euro buys a coffee or a tea, never both.
Β¬ ([euro] β’ coffee β tea)Β¬ ([euro] β’ coffee β tea)apply (counting_refute 1); count; naive_solver lia. Qed.Β¬ ([$0] β’ $1 β $2)
& is not β: a choice of A or B does not give both.
Β¬ ([$0 & $1] β’ $0 β $1)apply (counting_refute 1); count; naive_solver lia. Qed.Β¬ ([$0 & $1] β’ $0 β $1)
A single resource cannot be promoted to an unlimited supply. The bag
1 is not reusable.
Β¬ ([$0] β’ !$0)apply (counting_refute 1); count; naive_solver lia. Qed.Β¬ ([$0] β’ !$0)
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)apply (counting_refute 0); count; naive_solver lia. Qed.Β¬ ([] β’ $0 βΈ $0 β $0)Β¬ ([] β’ $0 β $1 βΈ $0)Β¬ ([] β’ $0 β $1 βΈ $0)Β¬ β x : nat, (β x0 x1 : nat, x0 = 1 β§ x1 = 1 β§ x = x0 + x1) β x = 1H: β x : nat, (β x0 x1 : nat, x0 = 1 β§ x1 = 1 β§ x = x0 + x1) β x = 1FalseH: β x : nat, (β x0 x1 : nat, x0 = 1 β§ x1 = 1 β§ x = x0 + x1) β x = 12 = 1by exists 1, 1. Qed.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
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 + 0nat β (β x : nat, x = 1 β False) β Falseby apply (Hf 1). Qed.Hf: β x : nat, x = 1 β FalseFalse