@@ -174,6 +174,30 @@ ghost fn on_pure_elim l p
174174 placeless_on_elim ( pure p ) l ;
175175}
176176
177+ ghost fn on_star_elim # l ( p q : slprop )
178+ requires on l ( p ** q )
179+ ensures on l p
180+ ensures on l q
181+ {
182+ ghost_impersonate l ( on l ( p ** q )) ( on l p ** on l q ) fn _ {
183+ on_elim ( p ** q );
184+ on_intro p ;
185+ on_intro q ;
186+ }
187+ }
188+
189+ ghost fn on_star_intro # l ( p q : slprop )
190+ requires on l p
191+ requires on l q
192+ ensures on l ( p ** q )
193+ {
194+ ghost_impersonate l ( on l p ** on l q ) ( on l ( p ** q )) fn _ {
195+ on_elim p ;
196+ on_elim q ;
197+ on_intro ( p ** q );
198+ }
199+ }
200+
177201ghost fn placeless_later_credit amt : placeless ( later_credit amt ) = l1 l2 {
178202 on_later_credit_eq l1 amt ;
179203 on_later_credit_eq l2 amt ;
@@ -203,6 +227,16 @@ ghost fn placeless_exists' u#a (#a: Type u#a) (p: a -> slprop) {| ((x:a) -> plac
203227}
204228let placeless_exists = placeless_exists'
205229
230+ ghost fn on_exists_elim u# a # l (# a : Type u# a ) ( p : a -> slprop )
231+ requires on l ( exists * x . p x )
232+ ensures exists * x . on l ( p x )
233+ {
234+ ghost_impersonate l ( on l ( exists * x . p x )) ( exists * x . on l ( p x )) fn _ {
235+ on_elim ( exists * x . p x );
236+ on_intro ( p _ );
237+ }
238+ }
239+
206240let timeless_in_same_process p =
207241 assert_norm ( in_same_process p == ( exists * l . loc l ** pure ( process_of l == process_of p )))
208242
@@ -216,40 +250,6 @@ ghost fn dup_in_same_process p () : duplicable_f (in_same_process p) = {
216250instance duplicable_in_same_process p : duplicable ( in_same_process p ) =
217251 { dup_f = dup_in_same_process p }
218252
219- ghost fn on_star_elim # l ( p q : slprop )
220- requires on l ( p ** q )
221- ensures on l p
222- ensures on l q
223- {
224- ghost_impersonate l ( on l ( p ** q )) ( on l p ** on l q ) fn _ {
225- on_elim ( p ** q );
226- on_intro p ;
227- on_intro q ;
228- }
229- }
230-
231- ghost fn on_star_intro # l ( p q : slprop )
232- requires on l p
233- requires on l q
234- ensures on l ( p ** q )
235- {
236- ghost_impersonate l ( on l p ** on l q ) ( on l ( p ** q )) fn _ {
237- on_elim p ;
238- on_elim q ;
239- on_intro ( p ** q );
240- }
241- }
242-
243- ghost fn on_exists_elim u# a # l (# a : Type u# a ) ( p : a -> slprop )
244- requires on l ( exists * x . p x )
245- ensures exists * x . on l ( p x )
246- {
247- ghost_impersonate l ( on l ( exists * x . p x )) ( exists * x . on l ( p x )) fn _ {
248- on_elim ( exists * x . p x );
249- on_intro ( p _ );
250- }
251- }
252-
253253ghost fn is_send_across_elim # b ( g : loc_id -> b ) p {| inst : is_send_across g p |} # l l'
254254 requires on l p
255255 requires pure ( g l == g l' )
0 commit comments