Require Import Undecidability.Synthetic.Definitions.
Require Import Undecidability.Synthetic.ReducibilityFacts.

Require Import Undecidability.TM.TM.

From Undecidability.MinskyMachines Require Import MM MM_sss BSM_MM.
From Undecidability Require
  TM.Reductions.HaltTM_1_to_SBTM_HALT StackMachines.Reductions.SBTM_HALT_to_HaltBSM.

Theorem HaltTM_to_MM_HALTS_ON_ZERO : HaltTM 1 MM_HALTS_ON_ZERO.
Proof.
  eapply reduces_transitive. { exact HaltTM_1_to_SBTM_HALT.reduction. }
  eapply reduces_transitive. { exact SBTM_HALT_to_HaltBSM.reduction. }
  red. unfold reduction.
  setoid_rewrite <- BSM_sss.Halt_BSM_iff.
  exact BSM_MM_HALTS_ON_ZERO.
Qed.

Theorem HaltTM_to_MM_HALTING : HaltTM 1 Halt_MM.
Proof.
  eapply reduces_transitive. { exact HaltTM_1_to_SBTM_HALT.reduction. }
  eapply reduces_transitive. { exact SBTM_HALT_to_HaltBSM.reduction. }
  red. unfold reduction.
  setoid_rewrite <- BSM_sss.Halt_BSM_iff.
  exact BSM_MM_HALTING.
Qed.