(* ---------------------------------------------------------------------- *)
(** **** Properties of all_notin *)

(* Specifications: *)
(** All_notin is true on empty lists. *)
Axiom all_notin_empty_l : forall A (E : gen_env A),
nil ⊄ E.
(** All_notin and notin. *)
Axiom all_notin_def : forall A xs (E : gen_env A),
(forall x, List.In x xs -> x ∉ E) ->
xs ⊄ E.
Axiom all_notin_def_inv : forall A xs (E : gen_env A),
xs ⊄ E ->
(forall x, List.In x xs -> x ∉ E).
Axiom all_notin_notin : forall A x xs (E : gen_env A),
(x :: xs) ⊄ E ->
x ∉ E ∧ xs ⊄ E.
Axiom notin_all_notin : forall A x xs (E : gen_env A),
x ∉ E ∧ xs ⊄ E ->
(x :: xs) ⊄ E.
(** All_notin and belongs. *)
Axiom all_notin_belongs_neq : forall A x ys (E : gen_env A),
x ∈ E -> ys ⊄ E ->
¬ List.In x ys.
(** All_notin is true on empty environments. *)
Axiom all_notin_empty_r : forall A xs,
xs ⊄ (@empty A).
(** All_notin in singular(s). *)
Axiom all_notin_single : forall A xs y (v : A),
¬ List.In y xs ->
xs ⊄ (y ∶ v).
Axiom all_notin_single_inv : forall A xs y (v : A),
xs ⊄ (y ∶ v) ->
¬ List.In y xs.
Axiom all_notin_singles : forall A xs ys (vs : list A),
List.Forall (fun x => ¬ List.In x ys) xs ->
xs ⊄ (ys ∷ vs).
Axiom all_notin_singles_inv : forall A xs ys (vs : list A),
length ys = length vs ->
xs ⊄ (ys ∷ vs) ->
List.Forall (fun x => ¬ List.In x ys) xs.
(** All_notin and concatenation. *)
Axiom all_notin_concat : forall A xs (F G : gen_env A),
xs ⊄ F -> xs ⊄ G ->
xs ⊄ (F & G).
Axiom all_notin_concat_inv : forall A xs (F G : gen_env A),
xs ⊄ (F & G) ->
xs ⊄ F ∧ xs ⊄ G.
(** All_notin and dom. *)
Axiom all_notin_dom : forall A xs (E : gen_env A),
xs ⊄ E ->
List.Forall (fun x => ¬ List.In x (dom E)) xs.
Axiom all_notin_dom_inv : forall A xs (E : gen_env A),
List.Forall (fun x => ¬ List.In x (dom E)) xs ->
xs ⊄ E.