(* Condition variables *)
(*Definition _cond_t := 4%positive.*)
Definition tcond := tint.
(* Does this need to be anything special? *)
Definition cond_var {cs} sh v := @data_at_ cs sh tcond v.
(*+ Specification of each concurrent primitive *)

(* Specifications: *)
Lemma approx_eq_i':
forall (P Q : pred rmap) n,
(|> (P <=> Q))%pred n -> approx n P = approx n Q.
Lemma fash_equiv_approx: forall n (R: pred rmap),
(|> (R <=> approx n R))%pred n.
Lemma nonexpansive_super_non_expansive: forall (F: mpred -> mpred),
nonexpansive F ->
forall R n,
approx n (F R) = approx n (F (approx n R)).
Lemma nonexpansive2_super_non_expansive: forall (F: mpred -> mpred -> mpred),
(forall P, nonexpansive (fun Q => F P Q)) ->
(forall Q, nonexpansive (fun P => F P Q)) ->
forall P Q n,
approx n (F P Q) = approx n (F (approx n P) (approx n Q)).
Lemma approx_eq_i':
forall (P Q : pred rmap) n,
(|> (P <=> Q))%pred n -> approx n P = approx n Q.
Lemma fash_equiv_approx: forall n (R: pred rmap),
(|> (R <=> approx n R))%pred n.
Lemma nonexpansive_super_non_expansive: forall (F: mpred -> mpred),
nonexpansive F ->
forall R n,
approx n (F R) = approx n (F (approx n R)).
Lemma nonexpansive2_super_non_expansive: forall (F: mpred -> mpred -> mpred),
(forall P, nonexpansive (fun Q => F P Q)) ->
(forall Q, nonexpansive (fun P => F P Q)) ->
forall P Q n,
approx n (F P Q) = approx n (F (approx n P) (approx n Q)).