Imports
Occurrence compatibility edges: emit one edge
The compatible branch copies both endpoint counters into one canonical edge record while restoring the counters exactly for the surrounding row loop.
noncomputable sectionopen StateTransitionnamespace CLRSnamespace Chapter34namespace Turingnamespace TMCliqueopen PolyBuilderprivate theorem replicate_tick_append_tick (count : Nat)
(tail : List CliqueSym) :
List.replicate count .tick ++ .tick :: tail =
List.replicate (count + 1) .tick ++ tail := by
induction count with
| zero => rfl
| succ count ih =>
simp only [List.replicate_succ, List.cons_append, ih]private theorem prependCliqueTicks_eq (count : Nat)
(tail : List CliqueSym) :
prependCliqueTicks count tail = List.replicate count .tick ++ tail := by
induction count with
| zero => rfl
| succ count ih =>
simp [prependCliqueTicks, List.replicate_succ, ih]private inductive CompatibilityEdgeCounter
| upper | lower
deriving DecidableEqprivate def compatibilityEdgeCopyLabel :
CompatibilityEdgeCounter → CompatibilityEdgesLabel
| .upper => .copyUpper
| .lower => .copyLowerprivate def compatibilityEdgeSaveLabel :
CompatibilityEdgeCounter → CompatibilityEdgesLabel
| .upper => .saveUpper
| .lower => .saveLowerprivate def compatibilityEdgePushTickLabel :
CompatibilityEdgeCounter → CompatibilityEdgesLabel
| .upper => .pushUpperTick
| .lower => .pushLowerTickprivate def compatibilityEdgeRestoreLabel :
CompatibilityEdgeCounter → CompatibilityEdgesLabel
| .upper => .restoreUpper
| .lower => .restoreLowerprivate def compatibilityEdgeRestoreIncLabel :
CompatibilityEdgeCounter → CompatibilityEdgesLabel
| .upper => .restoreUpperInc
| .lower => .restoreLowerIncprivate def compatibilityEdgeAfterRestoreLabel :
CompatibilityEdgeCounter → CompatibilityEdgesLabel
| .upper => .pushPairSeparator
| .lower => .pushEdgeMarkprivate def compatibilityEdgeCounterCfg
(counter : CompatibilityEdgeCounter) (label : CompatibilityEdgesLabel)
(buffer₁ buffer₂ : Option UnaryFrameSym) (test : Bool)
(input : List UnaryFrameSym) (output : List CliqueSym)
(work₁ work₂ : List UnaryFrameSym)
(primary other saved : Nat) : BuilderCfg compatibilityEdgesProgram :=
match counter with
| .upper => compatibilityEdgesCfg label buffer₁ buffer₂ test input output
work₁ work₂ primary other saved
| .lower => compatibilityEdgesCfg label buffer₁ buffer₂ test input output
work₁ work₂ other primary saved
private def compatibilityEdges_copyCounterRun
(counter : CompatibilityEdgeCounter) (remaining saved : Nat)
(input work₁ work₂ : List UnaryFrameSym)
(output : List CliqueSym) (buffer₁ buffer₂ : Option UnaryFrameSym)
(test : Bool) (other : Nat) :
EvalsToInTime (step compatibilityEdgesProgram)
(compatibilityEdgeCounterCfg counter (compatibilityEdgeCopyLabel counter)
buffer₁ buffer₂ test input output work₁ work₂
remaining other saved)
(some (compatibilityEdgeCounterCfg counter
(compatibilityEdgeRestoreLabel counter) buffer₁ buffer₂ false
input (List.replicate remaining .tick ++ output) work₁ work₂
0 other (saved + remaining))) (3 * remaining + 1) := by
induction remaining generalizing saved test output with
| zero =>
cases counter <;>
exact ⟨⟨1, by
simp [flip, compatibilityEdgeCounterCfg, compatibilityEdgeCopyLabel,
compatibilityEdgeRestoreLabel, step, compatibilityEdgesProgram,
compatibilityEdgesCfg, stepOp]⟩, le_rfl⟩
| succ remaining ih =>
let afterTick := compatibilityEdgeCounterCfg counter
(compatibilityEdgeCopyLabel counter) buffer₁ buffer₂ true input
(.tick :: output) work₁ work₂ remaining other (saved + 1)
have first : EvalsToInTime (step compatibilityEdgesProgram)
(compatibilityEdgeCounterCfg counter
(compatibilityEdgeCopyLabel counter) buffer₁ buffer₂ test input
output work₁ work₂ (remaining + 1) other saved)
(some afterTick) 3 := by
cases counter <;>
exact ⟨⟨3, by
simp [Function.iterate_succ_apply, flip, afterTick,
compatibilityEdgeCounterCfg, compatibilityEdgeCopyLabel,
List.replicate_succ, step,
compatibilityEdgesProgram, compatibilityEdgesCfg, stepOp]⟩,
le_rfl⟩
have rest := ih (saved := saved + 1) (test := true)
(output := .tick :: output)
let full := EvalsToInTime.trans (step compatibilityEdgesProgram)
3 (3 * remaining + 1) _ afterTick _ first rest
convert full using 1 <;> try omega
simp only [replicate_tick_append_tick, Nat.add_comm,
Nat.add_left_comm]
private def compatibilityEdges_restoreCounterRun
(counter : CompatibilityEdgeCounter) (saved restored : Nat)
(input work₁ work₂ : List UnaryFrameSym)
(output : List CliqueSym) (buffer₁ buffer₂ : Option UnaryFrameSym)
(test : Bool) (other : Nat) :
EvalsToInTime (step compatibilityEdgesProgram)
(compatibilityEdgeCounterCfg counter
(compatibilityEdgeRestoreLabel counter) buffer₁ buffer₂ test input
output work₁ work₂ restored other saved)
(some (compatibilityEdgeCounterCfg counter
(compatibilityEdgeAfterRestoreLabel counter) buffer₁ buffer₂ false
input output work₁ work₂ (restored + saved) other 0))
(2 * saved + 1) := by
induction saved generalizing restored test with
| zero =>
cases counter <;>
exact ⟨⟨1, by
simp [flip, compatibilityEdgeCounterCfg,
compatibilityEdgeRestoreLabel, compatibilityEdgeAfterRestoreLabel,
step, compatibilityEdgesProgram, compatibilityEdgesCfg, stepOp]⟩,
le_rfl⟩
| succ saved ih =>
let afterIncrement := compatibilityEdgeCounterCfg counter
(compatibilityEdgeRestoreLabel counter) buffer₁ buffer₂ true input
output work₁ work₂ (restored + 1) other saved
have first : EvalsToInTime (step compatibilityEdgesProgram)
(compatibilityEdgeCounterCfg counter
(compatibilityEdgeRestoreLabel counter) buffer₁ buffer₂ test input
output work₁ work₂ restored other (saved + 1))
(some afterIncrement) 2 := by
cases counter <;>
exact ⟨⟨2, by
simp [Function.iterate_succ_apply, flip, afterIncrement,
compatibilityEdgeCounterCfg, compatibilityEdgeRestoreLabel,
List.replicate_succ, step, compatibilityEdgesProgram,
compatibilityEdgesCfg, stepOp]⟩, le_rfl⟩
have rest := ih (restored := restored + 1) (test := true)
let full := EvalsToInTime.trans (step compatibilityEdgesProgram)
2 (2 * saved + 1) _ afterIncrement _ first rest
convert full using 1 <;> try omega
simp only [Nat.add_comm, Nat.add_left_comm]Exact budget for writing one compatible normalized edge.
def compatibilityEdgesEmitCompatibleEdgeSteps (upper lower : Nat) : Nat :=
5 * upper + 5 * lower + 7The compatible branch writes exactly the canonical normalized edge record and restores both endpoint counters before entering lower cleanup.
def compatibilityEdges_emitCompatibleEdgeRun
(upper lower : Nat) (input work₁ work₂ : List UnaryFrameSym)
(output : List CliqueSym) (buffer₁ buffer₂ : Option UnaryFrameSym)
(test : Bool) :
EvalsToInTime (step compatibilityEdgesProgram)
(compatibilityEdgesCfg .pushEdgeEnd buffer₁ buffer₂ test input output
work₁ work₂ upper lower 0)
(some (compatibilityEdgesCfg .clearLower buffer₁ buffer₂ false input
(encodeCliqueEdge (lower, upper) ++ output) work₁ work₂
upper lower 0))
(compatibilityEdgesEmitCompatibleEdgeSteps upper lower) := by
have endRun : EvalsToInTime (step compatibilityEdgesProgram)
(compatibilityEdgesCfg .pushEdgeEnd buffer₁ buffer₂ test input output
work₁ work₂ upper lower 0)
(some (compatibilityEdgesCfg .copyUpper buffer₁ buffer₂ test input
(.recordEnd :: output) work₁ work₂ upper lower 0)) 1 := by
exact ⟨⟨1, by
simp [flip, step, compatibilityEdgesProgram, compatibilityEdgesCfg,
stepOp]⟩, le_rfl⟩
have upperCopy := compatibilityEdges_copyCounterRun .upper upper 0 input
work₁ work₂ (.recordEnd :: output) buffer₁ buffer₂ test lower
have upperRestore := compatibilityEdges_restoreCounterRun .upper upper 0 input
work₁ work₂
(List.replicate upper .tick ++ .recordEnd :: output)
buffer₁ buffer₂ false lower
have pairRun : EvalsToInTime (step compatibilityEdgesProgram)
(compatibilityEdgesCfg .pushPairSeparator buffer₁ buffer₂ false input
(List.replicate upper .tick ++ .recordEnd :: output)
work₁ work₂ upper lower 0)
(some (compatibilityEdgesCfg .copyLower buffer₁ buffer₂ false input
(.pairSep :: List.replicate upper .tick ++ .recordEnd :: output)
work₁ work₂ upper lower 0)) 1 := by
exact ⟨⟨1, by
simp [flip, step, compatibilityEdgesProgram, compatibilityEdgesCfg,
stepOp]⟩, le_rfl⟩
have lowerCopy := compatibilityEdges_copyCounterRun .lower lower 0 input
work₁ work₂
(.pairSep :: List.replicate upper .tick ++ .recordEnd :: output)
buffer₁ buffer₂ false upper
have lowerRestore := compatibilityEdges_restoreCounterRun .lower lower 0 input
work₁ work₂
(List.replicate lower .tick ++
.pairSep :: List.replicate upper .tick ++ .recordEnd :: output)
buffer₁ buffer₂ false upper
have markRun : EvalsToInTime (step compatibilityEdgesProgram)
(compatibilityEdgesCfg .pushEdgeMark buffer₁ buffer₂ false input
(List.replicate lower .tick ++
.pairSep :: List.replicate upper .tick ++ .recordEnd :: output)
work₁ work₂ upper lower 0)
(some (compatibilityEdgesCfg .clearLower buffer₁ buffer₂ false input
(.edgeMark :: List.replicate lower .tick ++
.pairSep :: List.replicate upper .tick ++ .recordEnd :: output)
work₁ work₂ upper lower 0)) 1 := by
exact ⟨⟨1, by
simp [flip, step, compatibilityEdgesProgram, compatibilityEdgesCfg,
stepOp]⟩, le_rfl⟩
let first := EvalsToInTime.trans (step compatibilityEdgesProgram)
1 (3 * upper + 1) _ _ _ endRun (by
simpa [compatibilityEdgeCounterCfg, compatibilityEdgeCopyLabel,
compatibilityEdgeRestoreLabel] using upperCopy)
let second := EvalsToInTime.trans (step compatibilityEdgesProgram)
_ (2 * upper + 1) _ _ _ first (by
simpa [compatibilityEdgeCounterCfg, compatibilityEdgeRestoreLabel,
compatibilityEdgeAfterRestoreLabel] using upperRestore)
let third := EvalsToInTime.trans (step compatibilityEdgesProgram)
_ 1 _ _ _ second pairRun
let fourth := EvalsToInTime.trans (step compatibilityEdgesProgram)
_ (3 * lower + 1) _ _ _ third (by
simpa [compatibilityEdgeCounterCfg, compatibilityEdgeCopyLabel,
compatibilityEdgeRestoreLabel, List.append_assoc] using lowerCopy)
let fifth := EvalsToInTime.trans (step compatibilityEdgesProgram)
_ (2 * lower + 1) _ _ _ fourth (by
simpa [compatibilityEdgeCounterCfg, compatibilityEdgeRestoreLabel,
compatibilityEdgeAfterRestoreLabel, List.append_assoc] using lowerRestore)
let full := EvalsToInTime.trans (step compatibilityEdgesProgram)
_ 1 _ _ _ fifth (by simpa [List.append_assoc] using markRun)
convert full using 1 <;>
simp [encodeCliqueEdge, prependCliqueTicks_eq,
compatibilityEdgesEmitCompatibleEdgeSteps, Nat.add_assoc, Nat.add_comm,
Nat.add_left_comm]
all_goals try omegaend TMCliqueend Turingend Chapter34end CLRS