diff --git a/theories/heap_lang/lang.v b/theories/heap_lang/lang.v index 4c0027c96c5afc8a3ebc2f3a93eaa58252444616..55444e52ff0237edb2689fae2287477a3eb2ebe1 100644 --- a/theories/heap_lang/lang.v +++ b/theories/heap_lang/lang.v @@ -66,6 +66,9 @@ Inductive expr := | CAS (e0 : expr) (e1 : expr) (e2 : expr) | FAA (e1 : expr) (e2 : expr). +Notation NONE := (InjL (Lit LitUnit)) (only parsing). +Notation SOME x := (InjR x) (only parsing). + Bind Scope expr_scope with expr. Fixpoint is_closed (X : list string) (e : expr) : bool := @@ -94,6 +97,9 @@ Inductive val := | InjLV (v : val) | InjRV (v : val). +Notation NONEV := (InjLV (LitV LitUnit)) (only parsing). +Notation SOMEV x := (InjRV x) (only parsing). + Bind Scope val_scope with val. Fixpoint of_val (v : val) : expr := @@ -365,12 +371,12 @@ Definition bin_op_eval (op : bin_op) (v1 v2 : val) : option val := Definition vals_cas_compare_safe (vl v1 : val) : Prop := match vl, v1 with | LitV _, LitV _ => True - (* We want to support CAS'ing [NONEV := InjLV LitUnit] to [SOMEV #l := InjRV - (LitV l)]. An implementation of this is possible if literals have an invalid - bit pattern that can be used to represent NONE. *) - | InjLV (LitV LitUnit), InjLV (LitV LitUnit) => True - | InjLV (LitV LitUnit), InjRV (LitV _) => True - | InjRV (LitV _), InjLV (LitV LitUnit) => True + (* We want to support CAS'ing [NONEV] to [SOMEV #l]. An implementation of + this is possible if literals have an invalid bit pattern that can be used to + represent NONE. *) + | NONEV, NONEV => True + | NONEV, SOMEV (LitV _) => True + | SOMEV (LitV _), NONEV => True | _, _ => False end. (** Just a sanity check. *) diff --git a/theories/heap_lang/notation.v b/theories/heap_lang/notation.v index b3f40e89707e357e3e300a587f02cdd1fb0d49c1..d991e108db625e970de4409058fc7f4ea3f67786 100644 --- a/theories/heap_lang/notation.v +++ b/theories/heap_lang/notation.v @@ -144,12 +144,6 @@ Notation "e1 || e2" := (If e1%E (Lit (LitBool true)) e2%E) (only parsing) : expr_scope. (** Notations for option *) -Notation NONE := (InjL #()) (only parsing). -Notation SOME x := (InjR x) (only parsing). - -Notation NONEV := (InjLV #()) (only parsing). -Notation SOMEV x := (InjRV x) (only parsing). - Notation "'match:' e0 'with' 'NONE' => e1 | 'SOME' x => e2 'end'" := (Match e0 BAnon e1 x%bind e2) (e0, e1, x, e2 at level 200, only parsing) : expr_scope.