Definition mutexEqMix := EqMixin mutex_eqP.Canonical mutexEqType := Eval hnf in EqType (mutex T) mutexEqMix.Notation mutex := mutex.Notation mx := mx.Notation mx_undef := undef.Notation nown := nown.Notation own := own.Notation mutexPCM := mutexPCM.Notation mutexTPCM := mutexTPCM.(* binary mutexes can be obtained with T = Empty_set *)
Notation mtx := (mutex Empty_set).Implicit Types (t : T) (x : mutex T).CoInductive mutex_spec x : mutex T -> Type := 
| mutex_undef of x = mx_undef : mutex_spec x mx_undef
| mutex_nown of x = Unit : mutex_spec x Unit
| mutex_own of x = own : mutex_spec x own
| mutex_mx t of x = mx t : mutex_spec x (mx t).CoInductive mutex_spec x : mutex T -> Type := 
| mutex_undef of x = mx_undef : mutex_spec x mx_undef
| mutex_nown of x = Unit : mutex_spec x Unit
| mutex_own of x = own : mutex_spec x own
| mutex_mx t of x = mx t : mutex_spec x (mx t).CoInductive mutex_spec x : mutex T -> Type := 
| mutex_undef of x = mx_undef : mutex_spec x mx_undef
| mutex_nown of x = Unit : mutex_spec x Unit
| mutex_own of x = own : mutex_spec x own
| mutex_mx t of x = mx t : mutex_spec x (mx t).CoInductive mutex_spec x : mutex T -> Type := 
| mutex_undef of x = mx_undef : mutex_spec x mx_undef
| mutex_nown of x = Unit : mutex_spec x Unit
| mutex_own of x = own : mutex_spec x own
| mutex_mx t of x = mx t : mutex_spec x (mx t).CoInductive mutex_spec x : mutex T -> Type := 
| mutex_undef of x = mx_undef : mutex_spec x mx_undef
| mutex_nown of x = Unit : mutex_spec x Unit
| mutex_own of x = own : mutex_spec x own
| mutex_mx t of x = mx t : mutex_spec x (mx t).

(* Specifications: *)
Lemma mxP x : mutex_spec x x.
Lemma mx_valid t : valid (mx t).
Lemma mx_valid_own : valid (@own T).