diff --git a/barrier/barrier.v b/barrier/barrier.v index 6c3a9e21cb2e1e76bc5208c820666bc1237eb532..5848817392236c78773011b5a70ee3cff45ccbfb 100644 --- a/barrier/barrier.v +++ b/barrier/barrier.v @@ -15,7 +15,7 @@ Module barrier_proto. Proof. split. exact (State Low ∅). Qed. Definition change_tokens (I : gset gname) : set token := - mkSet (λ t, match t with Change i => i ∈ I | Send => False end). + mkSet (λ t, match t with Change i => i ∉ I | Send => False end). Inductive trans : relation stateT := | ChangeI p I2 I1 : trans (State p I1) (State p I2) @@ -34,7 +34,27 @@ Module barrier_proto. sts.closed sts (i_states i) {[ Change i ]}. Proof. split. - - apply non_empty_inhabited. + - apply (non_empty_inhabited (State Low {[ i ]})). rewrite !mkSet_elem_of /=. + apply lookup_singleton. + - move=>[p I]. rewrite /= /tok !mkSet_elem_of /= =>HI. + move=>s' /elem_of_intersection. rewrite !mkSet_elem_of /=. + move=>[[Htok|Htok] ? ]; subst s'; first done. + destruct p; done. + - move=>s1 s2. rewrite !mkSet_elem_of /==> Hs1 Hstep. + (* We probably want some helper lemmas for this... *) + inversion_clear Hstep as [T1 T2 Hdisj Hstep']. + inversion_clear Hstep' as [? ? ? ? Htrans Htok1 Htok2 Htok]. + destruct Htrans; last done; move:Hs1 Hdisj Htok1 Htok2 Htok. + rewrite /= /tok /=. + intros. apply dec_stable. + assert (Change i ∉ change_tokens I1) as HI1 + by (rewrite mkSet_not_elem_of; solve_elem_of +Hs1). + assert (Change i ∉ change_tokens I2) as HI2. + { destruct p. + - solve_elem_of +Htok Hdisj HI1. + - solve_elem_of +Htok Hdisj HI1 / discriminate. } + done. + Qed. End barrier_proto.