Definition uncurry {A B C} (f: A -> B -> C) (xy: A*B) : C :=
  f (fst xy) (snd xy).Fixpoint iter_sepcon2 (l : list B1) : list B2 -> A :=
    match l with
    | nil => fun l2 =>
       match l2 with
       | nil => emp
       | _ => FF
       end
    | x :: xl => fun l' =>
       match l' with
       | nil => FF
       | y :: yl => p x y * iter_sepcon2 xl yl
       end
  end.

Lemma pred_sepcon_strong_proper: forall P1 P2 p1 p2, (forall x, P1 x <-> P2 x) -> (forall x, P1 x -> P2 x -> p1 x = p2 x) -> pred_sepcon p1 P1 = pred_sepcon p2 P2.