Skip to content

Commit

Permalink
Add upwards semantics at the same time of downwards simantics.
Browse files Browse the repository at this point in the history
  • Loading branch information
QinxiangCao committed Nov 15, 2016
1 parent 0efe316 commit 5b2bc9f
Show file tree
Hide file tree
Showing 8 changed files with 249 additions and 20 deletions.
5 changes: 3 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,9 @@ PropositionalLogic_FILES = \
SeparationLogic_FILES = \
Syntax.v \
SeparationLogic.v \
QinxiangSantiagoSemantics.v Sound.v \
QinxiangSantiagoSemantics_Fail.v Sound_Fail.v
DownwardsSemantics.v Sound_Downwards.v \
UpwardsSemantics.v Sound_Upwards.v \
DownUpSemantics_Fail.v Sound_DownUp_Fail.v

FILES = \
$(lib_FILES:%.v=lib/%.v) \
Expand Down
3 changes: 3 additions & 0 deletions PropositionalLogic/GodelDummettLogic.v
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
(* M. Dummett. A propositional calculus with denumerable matrix. J. Symbolic Logic, 24(2):97–106, 1959. *)
(* K. G¨odel. On the intuitionistic propositional calculus. In S. Feferman, J. W. D. Jr, S. C. Kleene, G. H. Moore, R. M. Solovay, and J. van Heijenoort, editors, Collected Works, volume 1. Oxford University Press, 1986. *)

Require Import Coq.Logic.Classical_Prop.
Require Import Logic.lib.Coqlib.
Require Import Logic.MinimunLogic.LogicBase.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Local Open Scope logic_base.
Local Open Scope PropositionalLogic.
Local Open Scope SeparationLogic.

Class QinxiangSantiagoSemantics (L: Language) {nL: NormalLanguage L} {pL: PropositionalLanguage L} {SL: SeparationLanguage L} (SM: Semantics L) {pkSM: PreKripkeSemantics L SM} {kiSM: KripkeIntuitionisticSemantics L SM} : Type := {
Class DownUpSemantics (L: Language) {nL: NormalLanguage L} {pL: PropositionalLanguage L} {SL: SeparationLanguage L} (SM: Semantics L) {pkSM: PreKripkeSemantics L SM} {kiSM: KripkeIntuitionisticSemantics L SM} : Type := {
join: forall {M: Kmodel}, Kworlds M -> Kworlds M -> Kworlds M -> Prop;
join_comm: forall M (m1 m2 m: Kworlds M), join m1 m2 m -> join m2 m1 m;
join_assoc: forall M (mx my mz mxy mxyz: Kworlds M), join mx my mxy -> join mxy mz mxyz -> exists myz, join my mz myz /\ join mx myz mxyz;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Local Open Scope logic_base.
Local Open Scope PropositionalLogic.
Local Open Scope SeparationLogic.

Class QinxiangSantiago_Semantics (L: Language) {nL: NormalLanguage L} {pL: PropositionalLanguage L} {SL: SeparationLanguage L} (SM: Semantics L) {pkSM: PreKripkeSemantics L SM} {kiSM: KripkeIntuitionisticSemantics L SM} : Type := {
Class DownwardsSemantics (L: Language) {nL: NormalLanguage L} {pL: PropositionalLanguage L} {SL: SeparationLanguage L} (SM: Semantics L) {pkSM: PreKripkeSemantics L SM} {kiSM: KripkeIntuitionisticSemantics L SM} : Type := {
join: forall {M: Kmodel}, Kworlds M -> Kworlds M -> Kworlds M -> Prop;
join_comm: forall M (m1 m2 m: Kworlds M), join m1 m2 m -> join m2 m1 m;
join_assoc: forall M (mx my mz mxy mxyz: Kworlds M), join mx my mxy -> join mxy mz mxyz -> exists myz, join my mz myz /\ join mx myz mxyz;
Expand All @@ -19,13 +19,9 @@ Class QinxiangSantiago_Semantics (L: Language) {nL: NormalLanguage L} {pL: Propo
sat_wand: forall M m x y, KRIPKE: M , m |= x -* y <-> forall m0 m1 m2, Korder m0 m -> join m0 m1 m2 -> KRIPKE: M , m1 |= x -> KRIPKE: M, m2 |= y
}.

Class QinxiangSantiago_USemantics (L: Language) {nL: NormalLanguage L} {pL: PropositionalLanguage L} {SL: SeparationLanguage L} {uSL: UnitarySeparationLanguage L} (SM: Semantics L) {pkSM: PreKripkeSemantics L SM} {kiSM: KripkeIntuitionisticSemantics L SM} {qsSM: QinxiangSantiago_Semantics L SM}: Type := {
Class UnitaryDownwardsSemantics (L: Language) {nL: NormalLanguage L} {pL: PropositionalLanguage L} {SL: SeparationLanguage L} {uSL: UnitarySeparationLanguage L} (SM: Semantics L) {pkSM: PreKripkeSemantics L SM} {kiSM: KripkeIntuitionisticSemantics L SM} {dsSM: DownwardsSemantics L SM}: Type := {
unit := fun M (m: Kworlds M) => forall n n', join m n n' -> Korder n' n;
unit_exists: forall M (n: Kworlds M), exists m, join m n n /\ (forall m', Korder m' m -> unit M m');
sat_emp: forall M (m: Kworlds M), KRIPKE: M, m |= emp <-> forall n, Korder n m -> unit M n
}.

Class QinxiangSantiago_GCSemantics (L: Language) {nL: NormalLanguage L} {pL: PropositionalLanguage L} {SL: SeparationLanguage L} {uSL: UnitarySeparationLanguage L} (SM: Semantics L) {pkSM: PreKripkeSemantics L SM} {kiSM: KripkeIntuitionisticSemantics L SM} {qsSM: QinxiangSantiago_Semantics L SM}: Type := {
join_as_Korder: forall M (m1 m2 m: Kworlds M), join m1 m2 m -> Korder m m1
}.

Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@ Require Import Logic.MinimunLogic.MinimunLogic.
Require Import Logic.PropositionalLogic.Syntax.
Require Import Logic.SeparationLogic.Syntax.
Require Import Logic.PropositionalLogic.KripkeSemantics.
Require Import Logic.SeparationLogic.QinxiangSantiagoSemantics_Fail.
Require Import Logic.SeparationLogic.DownUpSemantics_Fail.
Require Import Logic.PropositionalLogic.IntuitionisticPropositionalLogic.
Require Import Logic.SeparationLogic.SeparationLogic.

Local Open Scope logic_base.
Local Open Scope PropositionalLogic.
Local Open Scope SeparationLogic.

Lemma sound_sepcon_comm {L: Language} {nL: NormalLanguage L} {pL: PropositionalLanguage L} {SL: SeparationLanguage L} {SM: Semantics L} {pkS: PreKripkeSemantics L SM} {kiSM: KripkeIntuitionisticSemantics L SM} {qsSM: QinxiangSantiagoSemantics L SM}:
Lemma sound_sepcon_comm {L: Language} {nL: NormalLanguage L} {pL: PropositionalLanguage L} {SL: SeparationLanguage L} {SM: Semantics L} {pkS: PreKripkeSemantics L SM} {kiSM: KripkeIntuitionisticSemantics L SM} {dusSM: DownUpSemantics L SM}:
forall x y: expr,
forall M m,
KRIPKE: M, m |= x * y --> y * x.
Expand All @@ -28,7 +28,7 @@ Proof.
apply join_comm; auto.
Qed.

Lemma sound_sepcon_assoc {L: Language} {nL: NormalLanguage L} {pL: PropositionalLanguage L} {SL: SeparationLanguage L} {SM: Semantics L} {pkS: PreKripkeSemantics L SM} {kiSM: KripkeIntuitionisticSemantics L SM} {qsSM: QinxiangSantiagoSemantics L SM}:
Lemma sound_sepcon_assoc {L: Language} {nL: NormalLanguage L} {pL: PropositionalLanguage L} {SL: SeparationLanguage L} {SM: Semantics L} {pkS: PreKripkeSemantics L SM} {kiSM: KripkeIntuitionisticSemantics L SM} {dusSM: DownUpSemantics L SM}:
forall x y z: expr,
forall M m,
KRIPKE: M, m |= x * (y * z) <--> (x * y) * z.
Expand Down
17 changes: 9 additions & 8 deletions SeparationLogic/Sound.v → SeparationLogic/Sound_Downwards.v
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@ Require Import Logic.MinimunLogic.MinimunLogic.
Require Import Logic.PropositionalLogic.Syntax.
Require Import Logic.SeparationLogic.Syntax.
Require Import Logic.PropositionalLogic.KripkeSemantics.
Require Import Logic.SeparationLogic.QinxiangSantiagoSemantics.
Require Import Logic.SeparationLogic.DownwardsSemantics.
Require Import Logic.PropositionalLogic.IntuitionisticPropositionalLogic.
Require Import Logic.SeparationLogic.SeparationLogic.

Local Open Scope logic_base.
Local Open Scope PropositionalLogic.
Local Open Scope SeparationLogic.

Lemma sound_sepcon_comm {L: Language} {nL: NormalLanguage L} {pL: PropositionalLanguage L} {SL: SeparationLanguage L} {SM: Semantics L} {pkS: PreKripkeSemantics L SM} {kiSM: KripkeIntuitionisticSemantics L SM} {qsSM: QinxiangSantiago_Semantics L SM}:
Lemma sound_sepcon_comm {L: Language} {nL: NormalLanguage L} {pL: PropositionalLanguage L} {SL: SeparationLanguage L} {SM: Semantics L} {pkS: PreKripkeSemantics L SM} {kiSM: KripkeIntuitionisticSemantics L SM} {dsSM: DownwardsSemantics L SM}:
forall x y: expr,
forall M m,
KRIPKE: M, m |= x * y --> y * x.
Expand All @@ -27,7 +27,7 @@ Proof.
apply join_comm; auto.
Qed.

Lemma sound_sepcon_assoc {L: Language} {nL: NormalLanguage L} {pL: PropositionalLanguage L} {sL: SeparationLanguage L} {SM: Semantics L} {pkS: PreKripkeSemantics L SM} {kiSM: KripkeIntuitionisticSemantics L SM} {qsSM: QinxiangSantiago_Semantics L SM}:
Lemma sound_sepcon_assoc {L: Language} {nL: NormalLanguage L} {pL: PropositionalLanguage L} {sL: SeparationLanguage L} {SM: Semantics L} {pkS: PreKripkeSemantics L SM} {kiSM: KripkeIntuitionisticSemantics L SM} {dsSM: DownwardsSemantics L SM}:
forall x y z: expr,
forall M m,
KRIPKE: M, m |= x * (y * z) <--> (x * y) * z.
Expand Down Expand Up @@ -66,7 +66,7 @@ Proof.
split; [| split]; auto.
Qed.

Lemma sound_wand_sepcon_adjoint {L: Language} {nL: NormalLanguage L} {pL: PropositionalLanguage L} {sL: SeparationLanguage L} {SM: Semantics L} {pkS: PreKripkeSemantics L SM} {kiSM: KripkeIntuitionisticSemantics L SM} {qsSM: QinxiangSantiago_Semantics L SM}:
Lemma sound_wand_sepcon_adjoint {L: Language} {nL: NormalLanguage L} {pL: PropositionalLanguage L} {sL: SeparationLanguage L} {SM: Semantics L} {pkS: PreKripkeSemantics L SM} {kiSM: KripkeIntuitionisticSemantics L SM} {dsSM: DownwardsSemantics L SM}:
forall x y z: expr,
forall M,
(forall m, KRIPKE: M, m |= x * y --> z) <-> (forall m, KRIPKE: M, m |= x --> (y -* z)).
Expand Down Expand Up @@ -106,7 +106,7 @@ Proof.
reflexivity.
Qed.

Lemma sound_sepcon_mono {L: Language} {nL: NormalLanguage L} {pL: PropositionalLanguage L} {sL: SeparationLanguage L} {SM: Semantics L} {pkS: PreKripkeSemantics L SM} {kiSM: KripkeIntuitionisticSemantics L SM} {qsSM: QinxiangSantiago_Semantics L SM}:
Lemma sound_sepcon_mono {L: Language} {nL: NormalLanguage L} {pL: PropositionalLanguage L} {sL: SeparationLanguage L} {SM: Semantics L} {pkS: PreKripkeSemantics L SM} {kiSM: KripkeIntuitionisticSemantics L SM} {dsSM: DownwardsSemantics L SM}:
forall x1 x2 y1 y2: expr,
forall M,
(forall m, KRIPKE: M, m |= x1 --> x2) ->
Expand Down Expand Up @@ -135,7 +135,7 @@ Proof.
exists m1, m2; auto.
Qed.

Lemma sound_sepcon_emp {L: Language} {nL: NormalLanguage L} {pL: PropositionalLanguage L} {sL: SeparationLanguage L} {uSL: UnitarySeparationLanguage L} {SM: Semantics L} {pkS: PreKripkeSemantics L SM} {kiSM: KripkeIntuitionisticSemantics L SM} {qsSM: QinxiangSantiago_Semantics L SM} {qsuSM: QinxiangSantiago_USemantics L SM}:
Lemma sound_sepcon_emp {L: Language} {nL: NormalLanguage L} {pL: PropositionalLanguage L} {sL: SeparationLanguage L} {uSL: UnitarySeparationLanguage L} {SM: Semantics L} {pkS: PreKripkeSemantics L SM} {kiSM: KripkeIntuitionisticSemantics L SM} {dsSM: DownwardsSemantics L SM} {UdsSM: UnitaryDownwardsSemantics L SM}:
forall x: expr,
forall M m, KRIPKE: M, m |= x * emp <--> x.
Proof.
Expand Down Expand Up @@ -163,9 +163,10 @@ Proof.
- rewrite sat_emp; auto.
Qed.

Lemma sound_sepcon_elim {L: Language} {nL: NormalLanguage L} {pL: PropositionalLanguage L} {sL: SeparationLanguage L} {uSL: UnitarySeparationLanguage L} {SM: Semantics L} {pkS: PreKripkeSemantics L SM} {kiSM: KripkeIntuitionisticSemantics L SM} {sSM: QinxiangSantiago_Semantics L SM} {gcsSM: QinxiangSantiago_GCSemantics L SM}:
Lemma sound_sepcon_elim {L: Language} {nL: NormalLanguage L} {pL: PropositionalLanguage L} {sL: SeparationLanguage L} {uSL: UnitarySeparationLanguage L} {SM: Semantics L} {pkS: PreKripkeSemantics L SM} {kiSM: KripkeIntuitionisticSemantics L SM} {dsSM: DownwardsSemantics L SM}:
forall x y: expr,
forall M m, KRIPKE: M, m |= x * y --> x.
forall M (join_as_Korder: forall M (m1 m2 m: Kworlds M), join m1 m2 m -> Korder m m1),
forall m, KRIPKE: M, m |= x * y --> x.
Proof.
intros.
pose proof Korder_PreOrder M as H_PreOrder.
Expand Down
193 changes: 193 additions & 0 deletions SeparationLogic/Sound_Upwards.v
Original file line number Diff line number Diff line change
@@ -0,0 +1,193 @@
Require Import Coq.Logic.Classical_Prop.
Require Import Logic.lib.Coqlib.
Require Import Logic.MinimunLogic.LogicBase.
Require Import Logic.MinimunLogic.MinimunLogic.
Require Import Logic.PropositionalLogic.Syntax.
Require Import Logic.SeparationLogic.Syntax.
Require Import Logic.PropositionalLogic.KripkeSemantics.
Require Import Logic.SeparationLogic.UpwardsSemantics.
Require Import Logic.PropositionalLogic.IntuitionisticPropositionalLogic.
Require Import Logic.SeparationLogic.SeparationLogic.

Local Open Scope logic_base.
Local Open Scope PropositionalLogic.
Local Open Scope SeparationLogic.

Lemma sound_sepcon_comm {L: Language} {nL: NormalLanguage L} {pL: PropositionalLanguage L} {SL: SeparationLanguage L} {SM: Semantics L} {pkS: PreKripkeSemantics L SM} {kiSM: KripkeIntuitionisticSemantics L SM} {usSM: UpwardsSemantics L SM}:
forall x y: expr,
forall M m,
KRIPKE: M, m |= x * y --> y * x.
Proof.
intros.
rewrite sat_impp; intros.
rewrite sat_sepcon in H0 |- *; intros.
destruct H0 as [m0 [m1 [m2 [? [? [? ?]]]]]].
exists m0, m2, m1.
split; [| split]; auto.
apply join_comm; auto.
Qed.

Lemma sound_sepcon_assoc {L: Language} {nL: NormalLanguage L} {pL: PropositionalLanguage L} {sL: SeparationLanguage L} {SM: Semantics L} {pkS: PreKripkeSemantics L SM} {kiSM: KripkeIntuitionisticSemantics L SM} {usSM: UpwardsSemantics L SM}:
forall x y z: expr,
forall M m,
KRIPKE: M, m |= x * (y * z) <--> (x * y) * z.
Proof.
intros.
pose proof Korder_PreOrder M as H_PreOrder.
unfold iffp.
rewrite sat_andp.
split; intros.
+ rewrite sat_impp; intros.
rewrite sat_sepcon in H0.
destruct H0 as [n' [mx' [myz' [? [? [? ?]]]]]].
rewrite sat_sepcon in H3.
destruct H3 as [myz'' [my'' [mz'' [? [? [? ?]]]]]].
apply join_comm in H1.
apply join_comm in H4.
assert (Korder mx' mx') by reflexivity.
destruct (join_Korder M _ _ _ _ _ H1 H3 H7) as [n'' [? ?]].
destruct (join_assoc _ mz'' my'' mx' myz'' n'' H4 H8) as [mxy'' [? ?]].
apply join_comm in H10.
apply join_comm in H11.
rewrite sat_sepcon.
exists n'', mxy'', mz''.
split; [| split; [| split]]; auto.
- etransitivity; eauto.
- rewrite sat_sepcon.
exists mxy'', mx', my''.
split; [| split; [| split]]; auto.
reflexivity.
+ rewrite sat_impp; intros.
rewrite sat_sepcon in H0.
destruct H0 as [n' [mxy' [mz' [? [? [? ?]]]]]].
rewrite sat_sepcon in H2.
destruct H2 as [mxy'' [mx'' [my'' [? [? [? ?]]]]]].
assert (Korder mz' mz') by reflexivity.
destruct (join_Korder M _ _ _ _ _ H1 H2 H7) as [n'' [? ?]].
destruct (join_assoc _ mx'' my'' mz' mxy'' n'' H4 H8) as [myz'' [? ?]].
rewrite sat_sepcon.
exists n'', mx'', myz''.
split; [| split; [| split]]; auto.
- etransitivity; eauto.
- rewrite sat_sepcon.
exists myz'', my'', mz'.
split; [| split; [| split]]; auto.
reflexivity.
Qed.

Lemma sound_wand_sepcon_adjoint {L: Language} {nL: NormalLanguage L} {pL: PropositionalLanguage L} {sL: SeparationLanguage L} {SM: Semantics L} {pkS: PreKripkeSemantics L SM} {kiSM: KripkeIntuitionisticSemantics L SM} {usSM: UpwardsSemantics L SM}:
forall x y z: expr,
forall M,
(forall m, KRIPKE: M, m |= x * y --> z) <-> (forall m, KRIPKE: M, m |= x --> (y -* z)).
Proof.
intros.
pose proof Korder_PreOrder M as H_PreOrder.
split; intro.
+ assert (ASSU: forall m0 m1 m2 m, Korder m m0 -> join m1 m2 m0 -> KRIPKE: M, m1 |= x -> KRIPKE: M, m2 |= y -> KRIPKE: M, m |= z).
Focus 1. {
intros.
specialize (H m).
rewrite sat_impp in H.
apply (H m); [reflexivity |].
rewrite sat_sepcon.
exists m0, m1, m2; auto.
} Unfocus.
clear H.
intros.
rewrite sat_impp; intros.
rewrite sat_wand; intros.
apply (ASSU m2 n m1 m2); auto.
reflexivity.
+ assert (ASSU: forall m1 m2 m, join m m1 m2 -> KRIPKE: M, m |= x -> KRIPKE: M, m1 |= y -> KRIPKE: M, m2 |= z).
Focus 1. {
intros.
specialize (H m).
rewrite sat_impp in H.
revert m1 m2 H0 H2.
rewrite <- sat_wand.
apply (H m); [reflexivity | auto].
} Unfocus.
intros.
rewrite sat_impp; intros.
rewrite sat_sepcon in H1.
destruct H1 as [m0 [m1 [m2 [? [? [? ?]]]]]].
pose proof (ASSU m2 m0 m1 H2 H3 H4).
eapply sat_mono; eauto.
Qed.

Lemma sound_sepcon_mono {L: Language} {nL: NormalLanguage L} {pL: PropositionalLanguage L} {sL: SeparationLanguage L} {SM: Semantics L} {pkS: PreKripkeSemantics L SM} {kiSM: KripkeIntuitionisticSemantics L SM} {usSM: UpwardsSemantics L SM}:
forall x1 x2 y1 y2: expr,
forall M,
(forall m, KRIPKE: M, m |= x1 --> x2) ->
(forall m, KRIPKE: M, m |= y1 --> y2) ->
(forall m, KRIPKE: M, m |= x1 * y1 --> x2 * y2).
Proof.
intros.
pose proof Korder_PreOrder M as H_PreOrder.
assert (ASSUx: forall m, KRIPKE: M, m |= x1 -> KRIPKE: M, m |= x2).
Focus 1. {
intros.
specialize (H m0).
rewrite sat_impp in H.
apply (H m0); [reflexivity | auto].
} Unfocus.
assert (ASSUy: forall m, KRIPKE: M, m |= y1 -> KRIPKE: M, m |= y2).
Focus 1. {
intros.
specialize (H0 m0).
rewrite sat_impp in H0.
apply (H0 m0); [reflexivity | auto].
} Unfocus.
rewrite sat_impp; intros.
rewrite sat_sepcon in H2 |- *.
destruct H2 as [m0 [m1 [m2 [? [? [? ?]]]]]].
exists m0, m1, m2; auto.
Qed.

Lemma sound_sepcon_emp {L: Language} {nL: NormalLanguage L} {pL: PropositionalLanguage L} {sL: SeparationLanguage L} {uSL: UnitarySeparationLanguage L} {SM: Semantics L} {pkS: PreKripkeSemantics L SM} {kiSM: KripkeIntuitionisticSemantics L SM} {usSM: UpwardsSemantics L SM} {UusSM: UnitaryUpwardsSemantics L SM}:
forall x: expr,
forall M m, KRIPKE: M, m |= x * emp <--> x.
Proof.
intros.
pose proof Korder_PreOrder M as H_PreOrder.
unfold iffp.
rewrite sat_andp.
split.
+ rewrite sat_impp; intros.
clear m H.
rewrite sat_sepcon in H0.
destruct H0 as [m'' [m' [u [? [? [? ?]]]]]].
rewrite sat_emp in H2.
destruct H2 as [u' [? ?]].
destruct (join_Korder M _ _ _ m' u' H0) as [m''' [? ?]]; [reflexivity | auto |].
apply join_comm in H4; apply H3 in H4.
subst m'''.
eapply sat_mono; eauto.
eapply sat_mono; eauto.
+ rewrite sat_impp; intros.
rewrite sat_sepcon.
destruct (unit_exists M n) as [u [? ?]].
exists n, n, u.
split; [| split; [| split]]; auto.
- reflexivity.
- apply join_comm; auto.
- rewrite sat_emp.
exists u; split; auto.
reflexivity.
Qed.

Lemma sound_sepcon_elim {L: Language} {nL: NormalLanguage L} {pL: PropositionalLanguage L} {sL: SeparationLanguage L} {uSL: UnitarySeparationLanguage L} {SM: Semantics L} {pkS: PreKripkeSemantics L SM} {kiSM: KripkeIntuitionisticSemantics L SM} {usSM: UpwardsSemantics L SM}:
forall x y: expr,
forall M (join_as_Korder: forall M (m1 m2 m: Kworlds M), join m1 m2 m -> Korder m m1),
forall m, KRIPKE: M, m |= x * y --> x.
Proof.
intros.
pose proof Korder_PreOrder M as H_PreOrder.
rewrite sat_impp; intros.
rewrite sat_sepcon in H0.
destruct H0 as [m0 [m1 [m2 [? [? [? ?]]]]]].
apply join_as_Korder in H1.
eapply sat_mono; eauto.
eapply sat_mono; eauto.
Qed.

Loading

0 comments on commit 5b2bc9f

Please sign in to comment.