ndefinition hint_declaration_Type0 ≝ λA:Type[0] .λa,b:A.Prop.
ndefinition hint_declaration_Type1 ≝ λA:Type[1].λa,b:A.Prop.
-ndefinition hint_declaration_Type2 ≝ λa,b:Type[1].Prop.
+ndefinition hint_declaration_Type2 ≝ λa,b:Type[2].Prop.
ndefinition hint_declaration_CProp0 ≝ λA:CProp[0].λa,b:A.Prop.
ndefinition hint_declaration_CProp1 ≝ λA:CProp[1].λa,b:A.Prop.
-ndefinition hint_declaration_CProp2 ≝ λa,b:CProp[1].Prop.
+ndefinition hint_declaration_CProp2 ≝ λa,b:CProp[2].Prop.
interpretation "hint_decl_Type2" 'hint_decl a b = (hint_declaration_Type2 a b).
interpretation "hint_decl_CProp2" 'hint_decl a b = (hint_declaration_CProp2 a b).
interpretation "exists1" 'exists x = (Ex1 ? x).
interpretation "exists" 'exists x = (Ex ? x).
+ninductive sigma (A : Type[0]) (P : A → CProp[0]) : Type[0] ≝
+ sig_intro : ∀x:A.P x → sigma A P.
+
+interpretation "sigma" 'sigma \eta.p = (sigma ? p).
+
nrecord iff (A,B: CProp[0]) : CProp[0] ≝
{ if: A → B;
fi: B → A
f_inj: injective … S iso_f
}.
+nlemma subseteq_intersection_l: ∀A.∀U,V,W:Ω^A.U ⊆ W ∨ V ⊆ W → U ∩ V ⊆ W.
+#A; #U; #V; #W; *; #H; #x; *; #xU; #xV; napply H; nassumption;
+nqed.
+
+nlemma subseteq_union_l: ∀A.∀U,V,W:Ω^A.U ⊆ W → V ⊆ W → U ∪ V ⊆ W.
+#A; #U; #V; #W; #H; #H1; #x; *; #Hx; ##[ napply H; ##| napply H1; ##] nassumption;
+nqed.
+
+nlemma subseteq_intersection_r: ∀A.∀U,V,W:Ω^A.W ⊆ U → W ⊆ V → W ⊆ U ∩ V.
+#A; #U; #V; #W; #H1; #H2; #x; #Hx; @; ##[ napply H1; ##| napply H2; ##] nassumption;
+nqed.
+
(*
nrecord isomorphism (A, B : setoid) (S: qpowerclass A) (T: qpowerclass B) : CProp[0] ≝
{ iso_f:> unary_morphism A B;