Definition nonlocal (Q: environ->mpred) := True.Ltac check_nonlocal :=
  match goal with
  |  |- nonlocal (local _) => fail 1
  |  |- nonlocal (prop _) => fail 1
  |  |- nonlocal (andp _ _) => fail 1
  |  |- nonlocal (sepcon _ _) => fail 1
  | |- _ => apply I
 end.

(* Specifications: *)
Lemma canon3: forall R1 B P Q R, nonlocal `(R1) -> do_canon (B * `(R1)) (PROPx P (LOCALx Q (SEPx R))) = do_canon B (PROPx (P) (LOCALx Q (SEPx (R1::R)))).
Lemma canon3b: forall R1 B P Q R, nonlocal `(R1) -> do_canon (`(R1)* B) (PROPx P (LOCALx Q (SEPx R))) = do_canon B (PROPx (P) (LOCALx Q (SEPx (R1::R)))).
Lemma canon4: forall P, do_canon emp P = P.
Lemma canon7: forall R1 P Q R, nonlocal `(R1) -> do_canon `(R1) (PROPx P (LOCALx Q (SEPx R))) = (PROPx P (LOCALx Q (SEPx (R1::R)))).
Lemma canon8: forall R1 R2 R3 PQR, do_canon ((R1 && R2) && R3) PQR = do_canon (R1 && (R2 && R3)) PQR.
Lemma start_canon: forall P, P = do_canon P (PROPx nil (LOCALx nil (SEPx nil ))).
Lemma canon5: forall Q R S, nonlocal Q -> Q && (local R && S) = local R && (Q && S).
Lemma canon5b: forall Q R S, nonlocal Q -> Q && (S && local R) = local R && (Q && S).
Lemma canon5c: forall Q R, nonlocal Q -> (Q && local R) = local R && Q.
Lemma canon6: forall Q R S, nonlocal Q -> Q && (prop R && S) = prop R && (Q && S).
Lemma canon6b: forall Q R S, nonlocal Q -> Q && (S && prop R) = prop R && (Q && S).
Lemma canon6c: forall Q R, nonlocal Q -> (Q && prop R) = prop R && Q.
Lemma canon17 : forall (P: Prop) PP QR, prop P && (PROPx PP QR) = PROPx (P::PP) QR.
Lemma finish_canon: forall R1 P Q R, do_canon `(R1) (PROPx P (LOCALx Q (SEPx R))) = (PROPx P (LOCALx Q (SEPx (R1::R)))).