proposition: Theorem type_list_enum : type_enum <-> list_enum.
proof: Proof. split. + intros (f & Hf). exists (fun n => match f n with Some x => x::nil | None => nil end). intros x; destruct (Hf x) as (n & Hn); exists n; rewrite <- Hn; simpl; auto. + intros (f & Hf). exists (fun n => let (a,b) := surj n in nth_error (f a) b). intros x; destruct (Hf x) as (a & Ha). destruct In_nth_error with (1 := Ha) as (b & Hb). destruct (Hsurj a b) as (n & Hn); exists n; now rewrite Hn. Qed.
imports: List Arith Bool Lia Eqdep_dec Undecidability.Synthetic.Definitions Undecidability.Synthetic.ReducibilityFacts Undecidability.Synthetic.InformativeDefinitions Undecidability.Synthetic.InformativeReducibilityFacts Undecidability.Shared.Libs.DLW.Utils(utils_tac utils_list utils_nat finite) Undecidability.Shared.Libs.DLW.Vec(pos vec) Undecidability.FOL.TRAKHTENBROT(notations utils fol_ops decidable)