Require Import List.
From Undecidability.Shared.Libs.DLW
Require Import utils.
Require Import Undecidability.Synthetic.Undecidability.
Require Import Undecidability.TM.TM.
From Undecidability.TM
Require Import TM SBTM Reductions.HaltTM_1_to_HaltSBTM Reductions.HaltSBTM_to_HaltSBTMu.
From Undecidability.StringRewriting
Require Import SR HaltSBTMu_to_SRH SRH_to_SR.
From Undecidability.PCP
Require Import PCP.
From Undecidability.PCP.Reductions
Require Import SR_to_MPCP MPCP_to_PCP PCP_to_PCPb PCPb_iff_iPCPb.
Import ReductionChainNotations UndecidabilityNotations.
Lemma HaltTM_1_chain_iPCPb :
HaltTM 1 ⪯ HaltSBTM /\
HaltSBTM ⪯ HaltSBTMu /\
HaltSBTMu ⪯ SRH /\
SRH ⪯ SR /\
SR ⪯ MPCP /\
MPCP ⪯ PCP /\
PCP ⪯ PCPb /\
PCPb ⪯ iPCPb.
Proof.
repeat eapply conj.
+ apply HaltTM_1_to_HaltSBTM.reduction.
+ apply HaltSBTM_to_HaltSBTMu.reduction.
+ apply HaltSBTMu_to_SRH.reduction.
+ apply SRH_to_SR.reduction.
+ apply SR_to_MPCP.reduction.
+ apply MPCP_to_PCP.reduction.
+ apply PCP_to_PCPb.reduction.
+ apply PCPb_iff_iPCPb.reductionLR.
Qed.
Lemma HaltTM_1_to_PCP : HaltTM 1 ⪯ PCP.
Proof.
repeat (eapply reduces_transitive; [eapply HaltTM_1_chain_iPCPb | try eapply reduces_reflexive]).
Qed.
Lemma HaltTM_1_to_PCPb : HaltTM 1 ⪯ PCPb.
Proof.
repeat (eapply reduces_transitive; [eapply HaltTM_1_chain_iPCPb | try eapply reduces_reflexive]).
Qed.
Lemma HaltTM_1_to_iPCPb : HaltTM 1 ⪯ iPCPb.
Proof.
repeat (eapply reduces_transitive; [eapply HaltTM_1_chain_iPCPb | try eapply reduces_reflexive]).
Qed.