proposition: Lemma SBTM_enumeration : { e : nat -> option SBTM | enumerator__T e SBTM }.
proof: Proof. assert {f | enumerator__T f {n : nat & Vector.t (option (Fin.t n * bool * direction) * option (Fin.t n * bool * direction)) n}} as [f Hf]. { eexists. eapply enumerator__T_sigT. - apply enumerator__T_nat. - intros x. apply enumerator__T_Vector. apply enumerator__T_prod. + apply enumerator__T_option. apply enumerator__T_prod; [apply enumerator__T_prod|]. * apply enumerator__T_Fin. * apply enumerator__T_bool. * apply (proj2_sig direction_enumeration). + apply enumerator__T_option. apply enumerator__T_prod; [apply enumerator__T_prod|]. * apply enumerator__T_Fin. * apply enumerator__T_bool. * apply (proj2_sig direction_enumeration). } exists (fun n => option_map SBTM_of_sigT (f n)). intros M. destruct (Hf (SBTM_to_sigT M)) as [n Hn]. exists n. rewrite Hn. now destruct M. Qed.
imports: Undecidability.Synthetic(Definitions EnumerabilityFacts) Undecidability.TM.SBTM