(** * Proofs and definitions obtained from external sources  This file contains proofs and definitions from external sources. Specifically from thr base library used in IC by Prof. Gert Smolka in the version from 15. February 2016. Some other definitions are taken from the preliminary file of then development of Heriditarily finite sets by Prof. Gert Smolka and Kathrin Stark. Mainly these are newer versions of the definitions from the base library from ICL. *)
Global Set Implicit Arguments.
Global Unset Strict Implicit.
Global Unset Printing Records.
Global Unset Printing Implicit Defensive.
Global Set Regular Subst Tactic.
Hint Extern 4 => exact _.  (* make auto use type class inference *)
Require Export Setoid Morphisms.
Require Export Omega List Morphisms.
Set Implicit Arguments.
(* Set Universe Polymorphism. *)
(* exists-style notation for Sigma-types *)
Notation "'Sigma' x .. y , p" :=
(sigT (fun x => .. (sigT (fun y => p)) ..))
(at level 200, x binder, right associativity,
format "'[' 'Sigma'  '/  ' x  ..  y ,  '/  ' p ']'")
: type_scope.
Ltac inv A := inversion A; subst; try clear A.
(** * De Morgan laws *)

Lemma DM_not_exists X (p : X -> Prop) :
~ (exists x, p x) <-> forall x, ~ p x.