Imports
Total serialized HAM-CYCLE to decision-TSP map
namespace CLRS.Chapter34.TSPReductionTotal raw reduction. A canonical, well-formed graph-only HAM instance is mapped to its canonical 1/2-weight matrix; every malformed source is sent to a fixed rejected TSP word.
def rawHamiltonianToTSP
(input : List HamiltonianCycleSym) : List TSPSym :=
match decodeHamiltonianCycleInstance input with
| some G =>
if G.WellFormed ∧ G.targetSize = G.vertexCount then
encodeTSPData (hamiltonianTSPData G)
else []
| none => []
@[simp] theorem rawHamiltonianToTSP_encode
(G : HamiltonianCycleInstance) (hwellFormed : G.WellFormed)
(htarget : G.targetSize = G.vertexCount) :
rawHamiltonianToTSP (encodeHamiltonianCycleInstance G) =
encodeTSPData (hamiltonianTSPData G) := by
simp only [rawHamiltonianToTSP]
rw [show decodeHamiltonianCycleInstance
(encodeHamiltonianCycleInstance G) = some G from
decode_encodeCliqueInstance G]
simp [hwellFormed, htarget]Exact language equivalence of the total serialized textbook map.
theorem rawHamiltonianToTSP_correct (input : List HamiltonianCycleSym) :
input ∈ GeneralHAMCYCLE ↔
rawHamiltonianToTSP input ∈ GeneralTSP := by
have hempty : ([] : List TSPSym) ∉ GeneralTSP := by
rintro ⟨data, hdecodeData, _⟩
simp [decodeTSPData] at hdecodeData
generalize hdecode : decodeHamiltonianCycleInstance input = result
cases result with
| none =>
have hsource : input ∉ GeneralHAMCYCLE := by
rintro ⟨G, hG, _⟩
rw [hdecode] at hG
contradiction
rw [show rawHamiltonianToTSP input = [] by
simp [rawHamiltonianToTSP, hdecode]]
exact iff_of_false hsource hempty
| some G =>
by_cases hvalid : G.WellFormed ∧ G.targetSize = G.vertexCount
· have hsource : input ∈ GeneralHAMCYCLE ↔
G.HasHamiltonianCycle := by
constructor
· rintro ⟨decoded, hdecoded, _, _, hcycle⟩
have hG : G = decoded := Option.some.inj
(hdecode.symm.trans hdecoded)
simpa [hG] using hcycle
· intro hcycle
exact ⟨G, hdecode, hvalid.1, hvalid.2, hcycle⟩
rw [show rawHamiltonianToTSP input =
encodeTSPData (hamiltonianTSPData G) by
simp [rawHamiltonianToTSP, hdecode, hvalid]]
rw [encodeTSPData_mem_iff, hamiltonianTSPData_hasTour_iff]
exact hsource
· have hsource : input ∉ GeneralHAMCYCLE := by
rintro ⟨decoded, hdecoded, hwellFormed, htarget, _⟩
have hG : G = decoded := Option.some.inj
(hdecode.symm.trans hdecoded)
apply hvalid
simpa [hG] using And.intro hwellFormed htarget
rw [show rawHamiltonianToTSP input = [] by
simp [rawHamiltonianToTSP, hdecode, hvalid]]
exact iff_of_false hsource hemptyend CLRS.Chapter34.TSPReduction