(* ---------------------------------------------------------------------- *)
(** **** Properties of belongs *)

(* Specifications: *)
(** Belongs is false on empty environments. *)
Axiom belongs_empty : forall A x,
x ∈ (@empty A) ->
False.
(** Belongs in singular(s). *)
Axiom belongs_single : forall A x y (v : A),
x = y ->
x ∈ (y ∶ v).
Axiom belongs_single_inv : forall A x y (v : A),
x ∈ (y ∶ v) ->
x = y.
Axiom belongs_singles : forall A x xs (vs : list A),
length xs = length vs ->
List.In x xs ->
x ∈ (xs ∷ vs).
Axiom belongs_singles_inv : forall A x xs (vs : list A),
length xs = length vs ->
x ∈ (xs ∷ vs) ->
List.In x xs.
(** Belongs and concatenation. *)
Axiom belongs_concat_l : forall A x (F G : gen_env A),
x ∈ F ->
x ∈ (F & G).
Axiom belongs_concat_r : forall A x (F G : gen_env A),
x ∈ F ->
x ∈ (G & F).
Axiom belongs_concat_inv : forall A x (F G : gen_env A),
x ∈ (F & G) ->
x ∈ F ∨ x ∈ G.
(** Belongs and dom. *)
Axiom belongs_dom : forall A x (E : gen_env A),
x ∈ E ->
List.In x (dom E).
Axiom belongs_dom_inv : forall A x (E : gen_env A),
List.In x (dom E) ->
x ∈ E.