diff --git a/algebra/sts.v b/algebra/sts.v index 0c04c52544fd9b943b165cfbb255e3b571ec166c..512e2f42a0c4d19b312513ba644bf3c513ee123c 100644 --- a/algebra/sts.v +++ b/algebra/sts.v @@ -450,3 +450,78 @@ Proof. Qed. End stsRA. + +(** STSs without tokens: Some stuff is simpler *) +Module sts_notok. +Structure stsT := STS { + state : Type; + prim_step : relation state; +}. +Arguments STS {_} _. +Arguments prim_step {_} _ _. +Notation states sts := (set (state sts)). + +Canonical sts_notok (sts : stsT) : sts.stsT := + sts.STS (token:=Empty_set) (@prim_step sts) (λ _, ∅). + +Section sts. +Context {sts : stsT}. +Implicit Types s : state sts. +Implicit Types S : states sts. + +Notation prim_steps := (rtc prim_step). + +Lemma sts_step s1 s2 : + prim_step s1 s2 → sts.step (s1, ∅) (s2, ∅). +Proof. + intros. split; set_solver. +Qed. + +Lemma sts_steps s1 s2 : + prim_steps s1 s2 → sts.steps (s1, ∅) (s2, ∅). +Proof. + induction 1; eauto using sts_step, rtc_refl, rtc_l. +Qed. + +Lemma frame_prim_step T s1 s2 : + sts.frame_step T s1 s2 → prim_step s1 s2. +Proof. + inversion 1 as [??? Hstep]. inversion_clear Hstep. done. +Qed. + +Lemma prim_frame_step T s1 s2 : + prim_step s1 s2 → sts.frame_step T s1 s2. +Proof. + intros Hstep. apply sts.Frame_step with ∅ ∅; first set_solver. + by apply sts_step. +Qed. + +Lemma mk_closed S : + (∀ s1 s2, s1 ∈ S → prim_step s1 s2 → s2 ∈ S) → sts.closed S ∅. +Proof. + intros ?. constructor; first by set_solver. + intros ????. eauto using frame_prim_step. +Qed. + +End sts. +Notation steps := (rtc prim_step). +End sts_notok. + +Coercion sts_notok.sts_notok : sts_notok.stsT >-> sts.stsT. +Notation sts_notokT := sts_notok.stsT. +Notation STS_NoTok := sts_notok.STS. + +Section sts_notokRA. +Import sts_notok. +Context {sts : sts_notokT}. +Implicit Types s : state sts. +Implicit Types S : states sts. + +Lemma sts_notok_update_auth s1 s2 : + rtc prim_step s1 s2 → sts_auth s1 ∅ ~~> sts_auth s2 ∅. +Proof. + intros. by apply sts_update_auth, sts_steps. +Qed. + +End sts_notokRA. +