11From ExtLib Require Import
22 Data.List
3+ Data.Monads.StateMonad
34 Structures.Monad.
45
56From Paco Require Import paco.
@@ -42,21 +43,21 @@ Section StateDelaySpec.
4243
4344 Definition StateDelayObs := EffectObsStateT St DelaySpec Delay.
4445
45- Definition StateDelayMonadMorph := MonadMorphimStateT St DelaySpec Delay.
46+ Definition StateDelayMonadMorph := MonadMorphismStateT St DelaySpec Delay.
4647
47- Definition PrePost A : Type := (Delay (St * A ) -> Prop ) * (St -> Prop).
48+ Definition PrePost A : Type := (Delay (A * St ) -> Prop ) * (St -> Prop).
4849
4950 Definition PrePostRef {A : Type } (m : StateDelay A) (pp : PrePost A) : Prop :=
5051 let '(post,pre) := pp in
51- forall s, pre s -> post (m s).
52+ forall s, pre s -> post (runStateT m s).
5253
5354 Program Definition encode {A : Type } (pp : PrePost A) : StateDelaySpec A :=
5455 let '(post,pre) := pp in
55- fun s p => pre s /\ (forall r, post r -> p r).
56+ mkStateT ( fun s p => pre s /\ (forall r, post r -> p r) ).
5657
5758 Definition verify_cond {A : Type} := DijkstraProp StateDelay StateDelaySpec StateDelayObs A.
5859
59- Lemma encode_correct : forall (A : Type ) (pre : St -> Prop ) (post : Delay (St * A ) -> Prop )
60+ Lemma encode_correct : forall (A : Type ) (pre : St -> Prop ) (post : Delay (A * St ) -> Prop )
6061 (m : StateDelay A),
6162 resp_eutt post -> (PrePostRef m (post,pre) <-> verify_cond (encode (post,pre)) m).
6263 Proof .
@@ -65,28 +66,28 @@ Section StateDelaySpec.
6566 - repeat red. simpl. intros. destruct p as [p Hp]. simpl in H1. destruct H1 as [Hpre Himp].
6667 auto.
6768 - repeat red in H0. simpl in H0.
68- set (exist _ post H) as p. enough ((m s) ∈ p); auto.
69+ set (exist _ post H) as p. enough ((runStateT m s) ∈ p); auto.
6970 apply H0. auto.
7071 Qed .
7172
7273 Definition PrePostPair A : Type := PrePost A * PrePost A.
7374
7475 Definition PrePostPairRef {A : Type } (pppp : PrePostPair A) (m : StateDelay A) :=
7576 let '((post0, pre0), (post1, pre1)) := pppp in
76- forall s, (pre0 s -> post0 (m s)) /\ (pre1 s -> post1 (m s)) .
77+ forall s, (pre0 s -> post0 (runStateT m s)) /\ (pre1 s -> post1 (runStateT m s)) .
7778
7879 Program Definition encode_pair {A : Type } (pppp : PrePostPair A) : StateDelaySpec A:=
7980 let '((post0, pre0), (post1, pre1)) := pppp in
80- fun s (p : DelaySpecInput (St * A )) =>
81- (pre0 s /\ (forall r, post0 r -> p r)) \/ (pre1 s /\ forall r, post1 r -> p r).
81+ mkStateT ( fun s (p : DelaySpecInput (A * St )) =>
82+ (pre0 s /\ (forall r, post0 r -> p r)) \/ (pre1 s /\ forall r, post1 r -> p r)) .
8283 Next Obligation .
8384 destruct H0 as [H0 | H1].
8485 - destruct H0 as [Hp Hr]. left. auto.
8586 - destruct H1 as [Hp Hr]. right. auto.
8687 Qed .
8788
8889 Lemma encode_pair_correct : forall (A : Type ) (pre0 pre1 : St -> Prop )
89- (post0 post1 : Delay (St * A ) -> Prop ) (m : StateDelay A),
90+ (post0 post1 : Delay (A * St ) -> Prop ) (m : StateDelay A),
9091 let pp : PrePostPair A := ((post0,pre0),(post1,pre1)) in
9192 resp_eutt post0 -> resp_eutt post1 ->
9293 (PrePostPairRef pp m <-> verify_cond (encode_pair pp) m).
@@ -97,20 +98,20 @@ Section StateDelaySpec.
9798 destruct H2 as [ [Hs Hp] | [Hs Hp] ]; simpl in *; auto.
9899 - repeat red in H1. simpl in *.
99100 split; intros.
100- + set (exist _ post0 H) as p. enough ((m s) ∈ p ); auto.
101+ + set (exist _ post0 H) as p. enough ((runStateT m s) ∈ p ); auto.
101102 apply H1. left. split; auto.
102- + set (exist _ post1 H0) as p. enough ((m s) ∈ p ); auto.
103+ + set (exist _ post1 H0) as p. enough ((runStateT m s) ∈ p ); auto.
103104 apply H1. right. split; auto.
104105 Qed .
105106
106107 Definition PrePostList A : Type := list (PrePost A).
107108
108109 Definition PrePostListRef {A : Type } (ppl : PrePostList A) (m : StateDelay A) :=
109- forall s, List.Forall (fun pp : PrePost A=> let (post,pre) := pp in pre s -> post (m s) ) ppl.
110+ forall s, List.Forall (fun pp : PrePost A=> let (post,pre) := pp in pre s -> post (runStateT m s) ) ppl.
110111
111112 Program Definition encode_list {A : Type } (ppl : PrePostList A) : StateDelaySpec A :=
112- fun s (p : DelaySpecInput (St * A ) ) =>
113- List.Exists (fun pp : PrePost A => let (post,pre) := pp in pre s /\ forall r, post r -> p r) ppl.
113+ mkStateT ( fun s (p : DelaySpecInput (A * St ) ) =>
114+ List.Exists (fun pp : PrePost A => let (post,pre) := pp in pre s /\ forall r, post r -> p r) ppl) .
114115 Next Obligation .
115116 induction H0; eauto .
116117 destruct x as [post pre]. destruct H0 as [Hs Hr]. left. auto.
@@ -129,7 +130,7 @@ Section StateDelaySpec.
129130 + destruct a as [post pre].
130131 inversion H1; subst.
131132 * destruct H3. auto.
132- assert ((pre s -> post (m s)) ); auto.
133+ assert ((pre s -> post (runStateT m s)) ); auto.
133134 intros. inversion Hrefine; subst; auto.
134135 * apply IHppl; auto.
135136 -- inversion H; auto.
@@ -142,24 +143,24 @@ Section StateDelaySpec.
142143 { inversion H. auto. }
143144 set (exist _ post Heutt) as p. specialize (Henc p) as Hencp.
144145 constructor; intros.
145- + enough ((m s) ∈ p ); auto. apply Hencp.
146+ + enough ((runStateT m s) ∈ p ); auto. apply Hencp.
146147 left. split; auto.
147148 + apply IHppl; auto.
148149 * inversion H. auto.
149150 * clear IHppl. intros. apply H0. eauto.
150151 Qed .
151152
152- Definition DynPrePost A : Type := (St -> Prop) * (St -> Delay (St * A ) -> Prop).
153+ Definition DynPrePost A : Type := (St -> Prop) * (St -> Delay (A * St ) -> Prop).
153154
154155 Definition DynPrePostRef {A : Type } (pp : DynPrePost A) (m : StateDelay A) :=
155156 let (pre,post) := pp in
156- forall s, pre s -> post s (m s).
157+ forall s, pre s -> post s (runStateT m s).
157158
158159 Program Definition encode_dyn {A : Type } (pp : DynPrePost A) : StateDelaySpec A :=
159160 let (pre,post) := pp in
160- fun s p => pre s /\ forall r, post s r -> p r.
161+ mkStateT ( fun s p => pre s /\ forall r, post s r -> p r) .
161162
162- Lemma encode_dyn_correct : forall (A : Type) (pre : St -> Prop) (post : St -> Delay (St * A ) -> Prop ) (m : StateDelay A),
163+ Lemma encode_dyn_correct : forall (A : Type) (pre : St -> Prop) (post : St -> Delay (A * St ) -> Prop ) (m : StateDelay A),
163164 (forall s, resp_eutt (post s)) -> (DynPrePostRef (pre,post) m <-> verify_cond (encode_dyn (pre,post) ) m).
164165 Proof .
165166 intros. unfold verify_cond, DijkstraProp. split; intros.
@@ -174,7 +175,7 @@ Section StateDelaySpec.
174175 Forall (fun pp => DynPrePostRef pp m) ppl.
175176
176177 Program Definition encode_list_dyn {A : Type } (ppl : list (DynPrePost A)) : StateDelaySpec A :=
177- fun s p => List.Exists (fun pp : DynPrePost A => let (pre,post) := pp in pre s /\ forall r, post s r -> p r ) ppl.
178+ mkStateT ( fun s p => List.Exists (fun pp : DynPrePost A => let (pre,post) := pp in pre s /\ forall r, post s r -> p r ) ppl) .
178179 Next Obligation .
179180 induction H0; eauto . left. destruct x as [pre post]. destruct H0 as [Hs Hr].
180181 split; auto.
@@ -192,7 +193,7 @@ Section StateDelaySpec.
192193 + destruct a as [pre post].
193194 inversion H1; subst.
194195 * destruct H2.
195- assert ((pre s -> post s (m s)) ); auto.
196+ assert ((pre s -> post s (runStateT m s)) ); auto.
196197 intros. inversion Hrefine; subst; auto.
197198 * apply IHppl; auto.
198199 -- inversion H; auto.
@@ -204,7 +205,7 @@ Section StateDelaySpec.
204205 { inversion H. auto. }
205206 constructor; intros.
206207 + red. intros. set (exist _ (post s) (Heutt s)) as p.
207- specialize (H0 s p). enough ((m s) ∈ p); auto. apply H0.
208+ specialize (H0 s p). enough ((runStateT m s) ∈ p); auto. apply H0.
208209 left. split; auto.
209210 + apply IHppl; auto.
210211 * inversion H. auto.
@@ -213,19 +214,19 @@ Section StateDelaySpec.
213214 Qed .
214215
215216 Lemma combine_prepost_aux : forall (A B : Type ) (pre1 pre2 : St -> Prop )
216- (post1 : Delay (St * A ) -> Prop ) (post2 : Delay (St * B ) -> Prop )
217+ (post1 : Delay (A * St ) -> Prop ) (post2 : Delay (B * St ) -> Prop )
217218 (m : StateDelay A) (f : A -> StateDelay B),
218219 verify_cond (encode (post1,pre1) ) m ->
219220 (forall (a : A) (s : St), (* this condition is not exactly what i want *)
220- post1 (Ret (s,a ) ) -> post2 (f a s) ) ->
221+ post1 (Ret (a,s ) ) -> post2 (runStateT ( f a) s) ) ->
221222 (post1 ITree.spin -> post2 ITree.spin) ->
222223 resp_eutt post1 ->
223224 verify_cond (encode (post2, pre1) ) (bind m f).
224225 Proof .
225226 intros. repeat red in H. repeat red. intros.
226227 destruct p as [p Hp]. simpl in *.
227228 destruct H3.
228- destruct (eutt_reta_or_div (m s)); basic_solve.
229+ destruct (eutt_reta_or_div (runStateT m s)); basic_solve.
229230 - destruct a as [s' a].
230231 cbn in H5. rewrite <- H5, bind_ret_l; cbn. apply H4, H0. rewrite H5.
231232 apply (H s (exist _ post1 H2)); auto.
@@ -234,10 +235,10 @@ Section StateDelaySpec.
234235 Qed .
235236
236237 Lemma combine_prepost : forall (A B : Type ) (pre1 pre2 : St -> Prop )
237- (post1 : Delay (St * A ) -> Prop ) (post2 : Delay (St * B ) -> Prop )
238+ (post1 : Delay (A * St ) -> Prop ) (post2 : Delay (B * St ) -> Prop )
238239 (m : StateDelay A) (f : A -> StateDelay B),
239240 verify_cond (encode (post1,pre1) ) m ->
240- (forall a s, post1 (Ret (s,a )) -> pre2 s) ->
241+ (forall a s, post1 (Ret (a,s )) -> pre2 s) ->
241242 (forall a, verify_cond (encode (post2,pre2) ) (f a) ) ->
242243 (post1 ITree.spin -> post2 ITree.spin) ->
243244 resp_eutt post1 ->
0 commit comments