Require Export Ensembles.
Require Export Families.
Require Export FiniteTypes.
Require Export IndexedFamilies.
Inductive finite_intersections {X:Type} (S:Family X) : Family X :=
| intro_full: In (finite_intersections S) Full_set
| intro_S: forall U:Ensemble X, In S U -> In (finite_intersections S) U
| intro_intersection: forall U V:Ensemble X,
In (finite_intersections S) U -> In (finite_intersections S) V ->
In (finite_intersections S) (Intersection U V).

(* Specifications: *)
Lemma finite_intersection_is_finite_indexed_intersection:
forall {X:Type} (S:Family X) (U:Ensemble X),
In (finite_intersections S) U -> exists J:Type, FiniteT J /\
exists V:J->Ensemble X,
(forall j:J, In S (V j)) /\ U = IndexedIntersection V.
Lemma finite_indexed_intersection_is_finite_intersection:
forall {X:Type} (S:Family X) (J:Type) (V:J->Ensemble X),
FiniteT J -> (forall j:J, In S (V j)) ->
In (finite_intersections S) (IndexedIntersection V).