@@ -52,6 +52,79 @@ ghost fn placeless_on (l: loc_id) (p: slprop) : placeless (on l p) = l1 l2 {
5252 on_on_eq l2 l p ; rewrite on l p as on l2 ( on l p );
5353}
5454
55+ [ @@deprecated " impersonate is unsound; only use for model implementations" ]
56+ noextract inline_for_extraction
57+ fn impersonate
58+ u# a ( a : Type u# a )
59+ ( l : loc_id ) ( pre : slprop ) ( post : a -> slprop )
60+ {| placeless pre , (( x : a ) -> placeless ( post x )) |}
61+ ( f : unit -> stt a ( loc l ** pre ) ( fun x -> loc l ** post x ))
62+ requires pre
63+ returns x : a
64+ ensures post x
65+ {
66+ on_loc_eq l l ; rewrite pure ( l == l ) as on l ( loc l );
67+ placeless_on_intro pre l ;
68+ on_star_eq l ( loc l ) pre ; rewrite on l ( loc l ) ** on l pre as on l ( loc l ** pre );
69+ let x = impersonate_core l ( loc l ** pre ) post fn _ {
70+ let x = f ();
71+ drop_ ( loc l );
72+ x
73+ };
74+ placeless_on_elim ( post x ) l ;
75+ x
76+ }
77+
78+ [ @@deprecated " atomic_impersonate is unsound; only use for model implementations" ]
79+ noextract inline_for_extraction
80+ atomic fn atomic_impersonate
81+ u# a ( a : Type u# a )
82+ (#[ T. exact (` emp_inames )] is : inames )
83+ ( l : loc_id ) ( pre : slprop ) ( post : a -> slprop )
84+ {| placeless pre , (( x : a ) -> placeless ( post x )) |}
85+ ( f : unit -> stt_atomic a is ( loc l ** pre ) ( fun x -> loc l ** post x ))
86+ opens is
87+ requires pre
88+ returns x : a
89+ ensures post x
90+ {
91+ on_loc_eq l l ; rewrite pure ( l == l ) as on l ( loc l );
92+ placeless_on_intro pre l ;
93+ on_star_eq l ( loc l ) pre ; rewrite on l ( loc l ) ** on l pre as on l ( loc l ** pre );
94+ let x = atomic_impersonate_core # a # is # Observable l ( loc l ** pre ) post fn _ {
95+ let x = f ();
96+ drop_ ( loc l );
97+ x
98+ };
99+ placeless_on_elim ( post x ) l ;
100+ x
101+ }
102+
103+ [ @@deprecated " unobservable_impersonate is unsound; only use for model implementations" ]
104+ noextract inline_for_extraction
105+ unobservable fn unobservable_impersonate
106+ u# a ( a : Type u# a )
107+ (#[ T. exact (` emp_inames )] is : inames )
108+ ( l : loc_id ) ( pre : slprop ) ( post : a -> slprop )
109+ {| placeless pre , (( x : a ) -> placeless ( post x )) |}
110+ ( f : unit -> stt_atomic a # Neutral is ( loc l ** pre ) ( fun x -> loc l ** post x ))
111+ opens is
112+ requires pre
113+ returns x : a
114+ ensures post x
115+ {
116+ on_loc_eq l l ; rewrite pure ( l == l ) as on l ( loc l );
117+ placeless_on_intro pre l ;
118+ on_star_eq l ( loc l ) pre ; rewrite on l ( loc l ) ** on l pre as on l ( loc l ** pre );
119+ let x = atomic_impersonate_core # a # is # Neutral l ( loc l ** pre ) post fn _ {
120+ let x = f ();
121+ drop_ ( loc l );
122+ x
123+ };
124+ placeless_on_elim ( post x ) l ;
125+ x
126+ }
127+
55128ghost fn ghost_impersonate
56129 (#[ T. exact (` emp_inames )] is : inames )
57130 ( l : loc_id ) ( pre post : slprop ) {| placeless pre , placeless post |}
0 commit comments