Local Open Scope logic_base.
Local Open Scope syntax.
Local Open Scope kripke_model.
Class SeparatingSemantics
(L: Language)
{SL: SeparationLanguage L}
(MD: Model)
{kMD: KripkeModel MD}
(M: Kmodel)
{R: Relation (Kworlds M)}
{J: Join (Kworlds M)}
(SM: Semantics L MD): Type :=
{
denote_sepcon: forall x y, Same_set _ (Kdenotation M (x * y)) (StrongSemantics.sepcon (Kdenotation M x) (Kdenotation M y));
denote_wand: forall x y, Same_set _ (Kdenotation M (x -* y)) (WeakSemantics.wand (Kdenotation M x) (Kdenotation M y))
}.
Class EmpSemantics
(L: Language)
{sL: SeparationLanguage L}
{s'L: SeparationEmpLanguage L}
(MD: Model)
{kMD: KripkeModel MD}
(M: Kmodel)
{R: Relation (Kworlds M)}
{J: Join (Kworlds M)}
(SM: Semantics L MD): Type :=
denote_emp: Same_set _ (Kdenotation M emp) WeakSemantics.emp.

(* Specifications: *)
Lemma sat_sepcon
{L: Language}
{sL: SeparationLanguage L}
{MD: Model}
{kMD: KripkeModel MD}
{M: Kmodel}
{R: Relation (Kworlds M)}
{J: Join (Kworlds M)}
{SM: Semantics L MD}
{dsSM: SeparatingSemantics L MD M SM}:
forall m x y,
KRIPKE: M , m |= x * y <->
exists m0 m1 m2, m0 <= m /\
join m1 m2 m0 /\
KRIPKE: M , m1 |= x /\
KRIPKE: M, m2 |= y.
Lemma sat_wand
{L: Language}
{sL: SeparationLanguage L}
{MD: Model}
{kMD: KripkeModel MD}
{M: Kmodel}
{R: Relation (Kworlds M)}
{J: Join (Kworlds M)}
{SM: Semantics L MD}
{dsSM: SeparatingSemantics L MD M SM}:
forall m x y,
KRIPKE: M , m |= x -* y <->
forall m1 m2, join m m1 m2 ->
KRIPKE: M , m1 |= x ->
KRIPKE: M, m2 |= y.
Lemma sat_emp
{L: Language}
{sL: SeparationLanguage L}
{s'L: SeparationEmpLanguage L}
{MD: Model}
{kMD: KripkeModel MD}
{M: Kmodel}
{R: Relation (Kworlds M)}
{J: Join (Kworlds M)}
{SM: Semantics L MD}
{deSM: EmpSemantics L MD M SM}:
forall (m: Kworlds M), KRIPKE: M, m |= emp <-> increasing m.