From stdpp Require Export coPset. From iris.bi Require Import interface derived_connectives. From iris.prelude Require Import options. Declare Scope expr_scope. Delimit Scope expr_scope with E. Declare Scope val_scope. Delimit Scope val_scope with V. Inductive stuckness := NotStuck | MaybeStuck. Definition stuckness_leb (s1 s2 : stuckness) : bool := match s1, s2 with | MaybeStuck, NotStuck => false | _, _ => true end. Global Instance stuckness_le : SqSubsetEq stuckness := stuckness_leb. Global Instance stuckness_le_po : PreOrder stuckness_le. Proof. split; by repeat intros []. Qed. Class Swp (PROP EXPR VAL A : Type) := wp : A → coPset → coPset → EXPR → (VAL → PROP) → PROP. Global Arguments wp {_ _ _ _ _} _ _ _ _%E _%I. Global Instance: Params (@wp) 9 := {}. Notation "'WP' e @ s ; E1 ; E2 {{ Φ } }" := (wp s E1 E2 e%E Φ) (at level 20, e, Φ at level 200, only parsing) : bi_scope. Notation "'WP' e @ E1 ; E2 {{ Φ } }" := (wp NotStuck E1 E2 e%E Φ) (at level 20, e, Φ at level 200, only parsing) : bi_scope. Notation "'WP' e @ E1 ; E2 ? {{ Φ } }" := (wp MaybeStuck E1 E2 e%E Φ) (at level 20, e, Φ at level 200, only parsing) : bi_scope. Notation "'WP' e @ s ; E1 {{ Φ } }" := (wp s E1 E1 e%E Φ) (at level 20, e, Φ at level 200, only parsing) : bi_scope. Notation "'WP' e @ E1 {{ Φ } }" := (wp NotStuck E1 E1 e%E Φ) (at level 20, e, Φ at level 200, only parsing) : bi_scope. Notation "'WP' e @ E1 ? {{ Φ } }" := (wp MaybeStuck E1 E1 e%E Φ) (at level 20, e, Φ at level 200, only parsing) : bi_scope. Notation "'WP' e {{ Φ } }" := (wp NotStuck ⊤ ⊤ e%E Φ) (at level 20, e, Φ at level 200, only parsing) : bi_scope. Notation "'WP' e ? {{ Φ } }" := (wp MaybeStuck ⊤ ⊤ e%E Φ) (at level 20, e, Φ at level 200, only parsing) : bi_scope. Notation "'WP' e @ s ; E1 ; E2 {{ v , Q } }" := (wp s E1 E2 e%E (λ v, Q)) (at level 20, e, Q at level 200, format "'[hv' 'WP' e '/' @ '[' s ; '/' E1 ; '/' E2 ']' '/' {{ '[' v , '/' Q ']' } } ']'") : bi_scope. Notation "'WP' e @ E1 ; E2 {{ v , Q } }" := (wp NotStuck E1 E2 e%E (λ v, Q)) (at level 20, e, Q at level 200, format "'[hv' 'WP' e '/' @ '[' E1 ; '/' E2 ']' '/' {{ '[' v , '/' Q ']' } } ']'") : bi_scope. Notation "'WP' e @ E1 ; E2 ? {{ v , Q } }" := (wp MaybeStuck E1 E2 e%E (λ v, Q)) (at level 20, e, Q at level 200, format "'[hv' 'WP' e '/' @ '[' E1 ; '/' E2 ']' '/' ? {{ '[' v , '/' Q ']' } } ']'") : bi_scope. Notation "'WP' e @ s ; E {{ v , Q } }" := (wp s E E e%E (λ v, Q)) (at level 20, e, Q at level 200, format "'[hv' 'WP' e '/' @ '[' s ; '/' E ']' '/' {{ '[' v , '/' Q ']' } } ']'") : bi_scope. Notation "'WP' e @ E {{ v , Q } }" := (wp NotStuck E E e%E (λ v, Q)) (at level 20, e, Q at level 200, format "'[hv' 'WP' e '/' @ E '/' {{ '[' v , '/' Q ']' } } ']'") : bi_scope. Notation "'WP' e @ E ? {{ v , Q } }" := (wp MaybeStuck E E e%E (λ v, Q)) (at level 20, e, Q at level 200, format "'[hv' 'WP' e '/' @ E '/' ? {{ '[' v , '/' Q ']' } } ']'") : bi_scope. Notation "'WP' e {{ v , Q } }" := (wp NotStuck ⊤ ⊤ e%E (λ v, Q)) (at level 20, e, Q at level 200, format "'[hv' 'WP' e '/' {{ '[' v , '/' Q ']' } } ']'") : bi_scope. Notation "'WP' e ? {{ v , Q } }" := (wp MaybeStuck ⊤ ⊤ e%E (λ v, Q)) (at level 20, e, Q at level 200, format "'[hv' 'WP' e '/' ? {{ '[' v , '/' Q ']' } } ']'") : bi_scope.