(** Actions that require a [Readable] permission*)
    Inductive raction ev : Prop :=
    | read: action ev = Read ->
            raction ev
    | acq: action ev = Acquire ->
           raction ev
    | rel: action ev = Release ->
           raction ev
    | facq: action ev = Failacq ->
            raction ev.(** Actions that require a [Readable] permission*)
    Inductive raction ev : Prop :=
    | read: action ev = Read ->
            raction ev
    | acq: action ev = Acquire ->
           raction ev
    | rel: action ev = Release ->
           raction ev
    | facq: action ev = Failacq ->
            raction ev.(** Actions that require a [Readable] permission*)
    Inductive raction ev : Prop :=
    | read: action ev = Read ->
            raction ev
    | acq: action ev = Acquire ->
           raction ev
    | rel: action ev = Release ->
           raction ev
    | facq: action ev = Failacq ->
            raction ev.(** Actions that require a [Readable] permission*)
    Inductive raction ev : Prop :=
    | read: action ev = Read ->
            raction ev
    | acq: action ev = Acquire ->
           raction ev
    | rel: action ev = Release ->
           raction ev
    | facq: action ev = Failacq ->
            raction ev.(** Actions that require a [Readable] permission*)
    Inductive raction ev : Prop :=
    | read: action ev = Read ->
            raction ev
    | acq: action ev = Acquire ->
           raction ev
    | rel: action ev = Release ->
           raction ev
    | facq: action ev = Failacq ->
            raction ev.(** Actions that require a [Writable] permission*)
    Inductive waction ev : Prop:=
    | write: action ev = Write ->
             waction ev
    | mk: action ev = Mklock ->
          waction ev
    | fl: action ev = Freelock ->
          waction ev.(** Actions that require a [Writable] permission*)
    Inductive waction ev : Prop:=
    | write: action ev = Write ->
             waction ev
    | mk: action ev = Mklock ->
          waction ev
    | fl: action ev = Freelock ->
          waction ev.(** Actions that require a [Writable] permission*)
    Inductive waction ev : Prop:=
    | write: action ev = Write ->
             waction ev
    | mk: action ev = Mklock ->
          waction ev
    | fl: action ev = Freelock ->
          waction ev.(** Actions that require a [Writable] permission*)
    Inductive waction ev : Prop:=
    | write: action ev = Write ->
             waction ev
    | mk: action ev = Mklock ->
          waction ev
    | fl: action ev = Freelock ->
          waction ev.

(* Specifications: *)
Lemma compete_cases: forall evi evj (Hcompetes: competes evi evj), (raction evi /\ waction evj) \/ (waction evi /\ caction evj).
Lemma waction_caction: forall ev, waction ev -> caction ev.
Lemma raction_caction: forall ev, raction ev -> caction ev.
Lemma raction_waction: forall ev, raction ev -> ~ waction ev.
Lemma waction_raction: forall ev, waction ev -> ~ raction ev.
Lemma caction_location: forall ev, caction ev -> exists b ofs sz, location ev = Some (b, ofs, sz).