+(* hints for epsilon *)
+nlemma epsilon_is_morph : ∀A:Alpha. (setoid1_of_setoid bool) ⇒_1 (lang A).
+#X; @; ##[#b; napply(ϵ b)] #a1 a2; ncases a1; ncases a2; //; *; nqed.
+
+nlemma epsilon_is_ext: ∀A:Alpha. (setoid1_of_setoid bool) → (Elang A).
+ #S b; @(ϵ b); #w1 w2 E; ncases b; @; ##[##3,4:*]
+nchange in match (w1 ∈ ϵ true) with ([] =_0 w1);
+nchange in match (w2 ∈ ϵ true) with ([] =_0 w2); #H; napply (.= H); /2/;
+nqed.
+
+alias symbol "hint_decl" = "hint_decl_Type1".
+unification hint 0 ≔ A : Alpha, B : bool;
+ AA ≟ LIST (acarr A),
+ R ≟ mk_ext_powerclass ?
+ (ϵ B) (ext_prop ? (epsilon_is_ext ? B))
+(*--------------------------------------------------------------------*) ⊢
+ ext_carr AA R ≡ epsilon A B.
+
+unification hint 0 ≔ S:Alpha, A:bool;
+ B ≟ setoid1_of_setoid BOOL,
+ T ≟ powerclass_setoid (list (carr (acarr S))),
+ MM ≟ mk_unary_morphism1 B T
+ (λB.ϵ B) (prop11 B T (epsilon_is_morph S))
+(*--------------------------------------------------------------------------*) ⊢
+ fun11 B T MM A ≡ epsilon S A.
+
+nlemma epsilon_is_ext_morph:∀A:Alpha. (setoid1_of_setoid bool) ⇒_1 (Elang A).
+#A; @(epsilon_is_ext …);
+#x1 x2 Ex; napply (prop11 … (epsilon_is_morph A)); nassumption.
+nqed.
+
+unification hint 1 ≔ AA : Alpha, B : bool;
+ AAS ≟ LIST (acarr AA),
+ BB ≟ setoid1_of_setoid BOOL,
+ T ≟ ext_powerclass_setoid AAS,
+ R ≟ mk_unary_morphism1 BB T
+ (λS.
+ mk_ext_powerclass AAS (epsilon AA S)
+ (ext_prop AAS (epsilon_is_ext AA S)))
+ (prop11 BB T (epsilon_is_ext_morph AA))
+(*------------------------------------------------------*) ⊢
+ ext_carr AAS (fun11 BB T R B) ≡ epsilon AA B.
+
+(* end hints for epsilon *)
+