repeat split.
- eauto.
- rename x into phi. induction 1; try congruence; subst.
+ now exists 0.
+ destruct IHprv as [m1]; eauto. destruct (el_T phi1) as [m2].
exists (1 + m1 + m2). cbn. in_app 2.
eapply in_concat_iff. eexists. split.
2:in_collect phi1...
in_collect phi2...
+ destruct IHprv1 as [m1], IHprv2 as [m2], (el_T phi2) as [m3]; eauto.
exists (1 + m1 + m2 + m3).
cbn. in_app 3. in_collect (phi1, phi2)...
+ destruct (el_T x) as [m1], (el_T y) as [m2],
(el_T phi) as [m3], IHprv as [m4]; eauto.
exists (1 + m1 + m2 + m3 + m4). cbn -[L_T]. in_app 4.
in_collect (phi, x, y)...
+ destruct (el_T x) as [m1], (el_T t) as [m2],
(el_T phi) as [m3], IHprv as [m4]; eauto.
exists (1 + m1 + m2 + m3 + m4). cbn. in_app 5.
in_collect (phi, x, t)...
+ destruct IHprv as [m1], (el_T phi) as [m2]; eauto.
exists (1 + m1 + m2). cbn. in_app 9.
in_collect phi...
+ destruct IHprv as [m1], (el_T phi) as [m2], (el_T true) as [m3]; eauto.
exists (1 + m1 + m2 + m3). cbn. in_app 9.
in_collect phi...
- intros [m]. revert A x H; induction m; intros; cbn in *.
+ eauto.
+ inv_collect; eauto.
destruct b, s; inv_collect; eauto.
Qed.

(* Specifications: *)
Lemma enumerable_min_prv : enumerable (prv_min []).
Lemma enumerable_intu_prv : enumerable (prv_intu []).
Lemma enumerable_class_prv : enumerable (prv_class []).