@@ -36,6 +36,79 @@ ghost fn placeless_on (l: loc_id) (p: slprop) : placeless (on l p) = l1 l2 {
3636 on_on_eq l2 l p ; rewrite on l p as on l2 ( on l p );
3737}
3838
39+ [ @@deprecated " impersonate is unsound; only use for model implementations" ]
40+ noextract inline_for_extraction
41+ fn impersonate
42+ u# a ( a : Type u# a )
43+ ( l : loc_id ) ( pre : slprop ) ( post : a -> slprop )
44+ {| placeless pre , (( x : a ) -> placeless ( post x )) |}
45+ ( f : unit -> stt a ( loc l ** pre ) ( fun x -> loc l ** post x ))
46+ requires pre
47+ returns x : a
48+ ensures post x
49+ {
50+ on_loc_eq l l ; rewrite pure ( l == l ) as on l ( loc l );
51+ placeless_on_intro pre l ;
52+ on_star_eq l ( loc l ) pre ; rewrite on l ( loc l ) ** on l pre as on l ( loc l ** pre );
53+ let x = impersonate_core l ( loc l ** pre ) post fn _ {
54+ let x = f ();
55+ drop_ ( loc l );
56+ x
57+ };
58+ placeless_on_elim ( post x ) l ;
59+ x
60+ }
61+
62+ [ @@deprecated " atomic_impersonate is unsound; only use for model implementations" ]
63+ noextract inline_for_extraction
64+ atomic fn atomic_impersonate
65+ u# a ( a : Type u# a )
66+ (#[ T. exact (` emp_inames )] is : inames )
67+ ( l : loc_id ) ( pre : slprop ) ( post : a -> slprop )
68+ {| placeless pre , (( x : a ) -> placeless ( post x )) |}
69+ ( f : unit -> stt_atomic a is ( loc l ** pre ) ( fun x -> loc l ** post x ))
70+ opens is
71+ requires pre
72+ returns x : a
73+ ensures post x
74+ {
75+ on_loc_eq l l ; rewrite pure ( l == l ) as on l ( loc l );
76+ placeless_on_intro pre l ;
77+ on_star_eq l ( loc l ) pre ; rewrite on l ( loc l ) ** on l pre as on l ( loc l ** pre );
78+ let x = atomic_impersonate_core # a # is # Observable l ( loc l ** pre ) post fn _ {
79+ let x = f ();
80+ drop_ ( loc l );
81+ x
82+ };
83+ placeless_on_elim ( post x ) l ;
84+ x
85+ }
86+
87+ [ @@deprecated " unobservable_impersonate is unsound; only use for model implementations" ]
88+ noextract inline_for_extraction
89+ unobservable fn unobservable_impersonate
90+ u# a ( a : Type u# a )
91+ (#[ T. exact (` emp_inames )] is : inames )
92+ ( l : loc_id ) ( pre : slprop ) ( post : a -> slprop )
93+ {| placeless pre , (( x : a ) -> placeless ( post x )) |}
94+ ( f : unit -> stt_atomic a # Neutral is ( loc l ** pre ) ( fun x -> loc l ** post x ))
95+ opens is
96+ requires pre
97+ returns x : a
98+ ensures post x
99+ {
100+ on_loc_eq l l ; rewrite pure ( l == l ) as on l ( loc l );
101+ placeless_on_intro pre l ;
102+ on_star_eq l ( loc l ) pre ; rewrite on l ( loc l ) ** on l pre as on l ( loc l ** pre );
103+ let x = atomic_impersonate_core # a # is # Neutral l ( loc l ** pre ) post fn _ {
104+ let x = f ();
105+ drop_ ( loc l );
106+ x
107+ };
108+ placeless_on_elim ( post x ) l ;
109+ x
110+ }
111+
39112ghost fn ghost_impersonate
40113 (#[ T. exact (` emp_inames )] is : inames )
41114 ( l : loc_id ) ( pre post : slprop ) {| placeless pre , placeless post |}
0 commit comments