Set Implicit Arguments.
Definition sepcon_unique1 {X A} `{SepLog A} (P: X -> A): Prop :=
forall x, P x * P x |-- FF.
Definition sepcon_unique2 {X Y A} `{SepLog A} (P: X -> Y -> A): Prop :=
forall x y1 y2, P x y1 * P x y2 |-- FF.
Section IterSepCon.
Context {A : Type}.
Context {B : Type}.
Context {ND : NatDed A}.
Context {SL : SepLog A}.
Context {ClS: ClassicalSep A}.
Context {CoSL: CorableSepLog A}.
Section SingleSepPred.
Context (p : B -> A).
Fixpoint iter_sepcon (l : list B) : A :=
match l with
| nil => emp
| x :: xl => p x * iter_sepcon xl
end.

Lemma iter_sepcon_unique_nodup: forall (l : list B), sepcon_unique1 p -> iter_sepcon l |-- !!(NoDup l).