Skip to content

Commit 80b33cc

Browse files
committed
Add straight-line composition lemmas for cleaner proofs
Add is_straight_line_append, is_straight_line_cons, is_straight_line_singleton, and Instr.*_is_non_jumping lemmas to StraightLine.lean. These provide reusable building blocks for proving composite programs are straight-line. Update Preservation.lean files in Minimization and PrimitiveRecursion to use the new composition lemmas, making the proof structure more explicit.
1 parent 06cdd64 commit 80b33cc

File tree

3 files changed

+54
-19
lines changed

3 files changed

+54
-19
lines changed

Urm/Minimization/Preservation.lean

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,10 @@ private theorem loop_prologue_no_write_high (r : ℕ) (hr : minimization_base n
4646
/-- Setup phase is a straight-line program. -/
4747
theorem setup_phase_is_straight_line :
4848
(setup_phase n pF).is_straight_line = true := by
49-
simp only [setup_phase, Program.is_straight_line, List.all_append, List.all_cons, List.all_nil,
50-
Bool.and_true, Bool.and_eq_true]
51-
refine ⟨copy_register_range_is_straight_line 0 (savedInputsStart n pF) n, ?_, rfl⟩
52-
simp [Instr.is_non_jumping]
49+
simp only [setup_phase]
50+
exact is_straight_line_append (copy_register_range_is_straight_line _ _ _)
51+
(is_straight_line_cons (Instr.Z_is_non_jumping _)
52+
(is_straight_line_singleton (Instr.Z_is_non_jumping _)))
5353

5454
/-- After setup phase, saved inputs contain original inputs. -/
5555
theorem setup_phase_saves_inputs (inputs : Fin n → ℕ)
@@ -161,10 +161,10 @@ theorem setup_phase_zero_reg_zero
161161
/-- Loop prologue is a straight-line program. -/
162162
theorem loop_prologue_is_straight_line :
163163
(loop_prologue n pF).is_straight_line = true := by
164-
simp only [loop_prologue, Program.is_straight_line, List.all_append, List.all_cons, List.all_nil,
165-
Bool.and_true, Bool.and_eq_true]
166-
exact ⟨⟨clear_registers_is_straight_line (minimization_base n pF),
167-
copy_register_range_is_straight_line (savedInputsStart n pF) 0 n⟩, rfl⟩
164+
simp only [loop_prologue]
165+
apply is_straight_line_append _ (is_straight_line_singleton (Instr.T_is_non_jumping _ _))
166+
exact is_straight_line_append (clear_registers_is_straight_line _)
167+
(copy_register_range_is_straight_line _ _ _)
168168

169169
/-- After loop prologue, R[0..n-1] contain saved inputs. -/
170170
theorem loop_prologue_restores_inputs

Urm/PrimitiveRecursion/Preservation.lean

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -67,25 +67,26 @@ private theorem pr_loop_prologue_no_write_high (n : ℕ) (pF pG : Program) (r :
6767
/-- Setup phase is a straight-line program. -/
6868
theorem pr_setup_phase_is_straight_line (n : ℕ) (pF pG : Program) :
6969
(pr_setup_phase n pF pG).is_straight_line = true := by
70-
simp only [pr_setup_phase, Program.is_straight_line, List.all_append, List.all_cons, List.all_nil,
71-
Bool.and_true, Bool.and_eq_true]
72-
refine ⟨copy_register_range_is_straight_line 0 (pr_saved_inputs_start n pF pG) (n + 1), ?_, rfl⟩
73-
simp [Instr.is_non_jumping]
70+
simp only [pr_setup_phase]
71+
exact is_straight_line_append (copy_register_range_is_straight_line _ _ _)
72+
(is_straight_line_cons (Instr.Z_is_non_jumping _)
73+
(is_straight_line_singleton (Instr.Z_is_non_jumping _)))
7474

7575
/-- Base case prologue is a straight-line program. -/
7676
theorem pr_base_case_prologue_is_straight_line (n : ℕ) (pF pG : Program) :
7777
(pr_base_case_prologue n pF pG).is_straight_line = true := by
78-
simp only [pr_base_case_prologue, Program.is_straight_line, List.all_append, Bool.and_eq_true]
79-
exact ⟨clear_registers_is_straight_line (primitive_recursion_base n pF pG),
80-
copy_register_range_is_straight_line (pr_saved_inputs_start n pF pG) 0 n⟩
78+
simp only [pr_base_case_prologue]
79+
exact is_straight_line_append (clear_registers_is_straight_line _)
80+
(copy_register_range_is_straight_line _ _ _)
8181

8282
/-- Loop prologue is a straight-line program. -/
8383
theorem pr_loop_prologue_is_straight_line (n : ℕ) (pF pG : Program) :
8484
(pr_loop_prologue n pF pG).is_straight_line = true := by
85-
simp only [pr_loop_prologue, Program.is_straight_line, List.all_append, Bool.and_eq_true]
86-
refine ⟨⟨clear_registers_is_straight_line (primitive_recursion_base n pF pG),
87-
copy_register_range_is_straight_line (pr_saved_inputs_start n pF pG) 0 n⟩, ?_⟩
88-
simp only [List.all_cons, List.all_nil, Instr.is_non_jumping, Bool.and_self]
85+
simp only [pr_loop_prologue]
86+
apply is_straight_line_append _ (is_straight_line_cons (Instr.T_is_non_jumping _ _)
87+
(is_straight_line_singleton (Instr.T_is_non_jumping _ _)))
88+
exact is_straight_line_append (clear_registers_is_straight_line _)
89+
(copy_register_range_is_straight_line _ _ _)
8990

9091
/-! ## Setup Phase Invariants -/
9192

Urm/StraightLine.lean

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,40 @@ theorem clear_registers_from_preserves (start count : ℕ) (s : State) (r : ℕ)
286286
simp only [Instr.writes_to, ne_eq, Option.some.injEq]
287287
omega
288288

289+
/-! ## Straight-Line Program Composition
290+
291+
Lemmas for proving composite programs are straight-line.
292+
These simplify proofs in Preservation.lean files across closures. -/
293+
294+
/-- Append preserves straight-line property. -/
295+
theorem is_straight_line_append {p q : Program}
296+
(hp : p.is_straight_line = true) (hq : q.is_straight_line = true) :
297+
(p ++ q).is_straight_line = true := by
298+
simp only [Program.is_straight_line, List.all_append] at hp hq ⊢
299+
rw [hp, hq]; rfl
300+
301+
/-- Cons of non-jumping instruction preserves straight-line. -/
302+
theorem is_straight_line_cons {instr : Instr} {p : Program}
303+
(hinstr : instr.is_non_jumping = true) (hp : p.is_straight_line = true) :
304+
Program.is_straight_line (instr :: p) = true := by
305+
simp only [Program.is_straight_line, List.all_cons] at hp ⊢
306+
rw [hinstr, hp]; rfl
307+
308+
/-- Singleton non-jumping instruction is straight-line. -/
309+
theorem is_straight_line_singleton {instr : Instr}
310+
(h : instr.is_non_jumping = true) :
311+
Program.is_straight_line [instr] = true := by
312+
simp only [Program.is_straight_line, List.all_cons, List.all_nil, h, Bool.and_self]
313+
314+
/-- Z instruction is non-jumping. -/
315+
@[simp] theorem Instr.Z_is_non_jumping (n : ℕ) : (Instr.Z n).is_non_jumping = true := rfl
316+
317+
/-- S instruction is non-jumping. -/
318+
@[simp] theorem Instr.S_is_non_jumping (n : ℕ) : (Instr.S n).is_non_jumping = true := rfl
319+
320+
/-- T instruction is non-jumping. -/
321+
@[simp] theorem Instr.T_is_non_jumping (m n : ℕ) : (Instr.T m n).is_non_jumping = true := rfl
322+
289323
/-! ## clear_registers and copy_register_range
290324
291325
These are straight-line program building blocks used by both Composition and Minimization. -/

0 commit comments

Comments
 (0)