(* ---------------------------------------------------------------------- *)
(** **** Properties of notin *)

(* Specifications: *)
(** Notin and belongs. *)
Axiom notin_belongs : forall A x (E : gen_env A),
x ∉ E ->
¬ x ∈ E.
Axiom belongs_notin : forall A x (E : gen_env A),
x ∈ E ->
¬ x ∉ E.
Axiom not_belongs_notin : forall A x (E : gen_env A),
¬ x ∈ E ->
x ∉ E.
Axiom notin_belongs_neq : forall A x y (E : gen_env A),
x ∈ E -> y ∉ E ->
x <> y.
(** Notin is true on empty environments. *)
Axiom notin_empty : forall A x,
x ∉ (@empty A).
(** Notin in singular(s). *)
Axiom notin_single : forall A x y (v : A),
x <> y ->
x ∉ (y ∶ v).
Axiom notin_single_inv : forall A x y (v : A),
x ∉ (y ∶ v) ->
x <> y.
Axiom notin_singles : forall A x xs (vs : list A),
¬ List.In x xs ->
x ∉ (xs ∷ vs).
Axiom notin_singles_inv : forall A x xs (vs : list A),
length xs = length vs ->
x ∉ (xs ∷ vs) ->
¬ List.In x xs.
(** Notin and concatenation. *)
Axiom notin_concat : forall A x (F G : gen_env A),
x ∉ F -> x ∉ G ->
x ∉ (F & G).
Axiom notin_concat_inv : forall A x (F G : gen_env A),
x ∉ (F & G) ->
x ∉ F ∧ x ∉ G.
(** Notin and dom. *)
Axiom notin_dom : forall A x (E : gen_env A),
x ∉ E ->
¬ List.In x (dom E).
Axiom notin_dom_inv : forall A x (E F : gen_env A),
¬ List.In x (dom E) ->
x ∉ E.