跳到正文
参考文档 / ZLIB × LEAN

DeflateBlIndex.lean

此页源文件快照 · 011c72fa975146eb · 对应提交的原文 ↗

本页保留 Lean 源码及行号。点击行号可定位语句,点击 import 中的模块名可查看依赖。

1import Std.Tactic
2
3/-! # The descending search for the last bit-length code rank
4
5The recursive maximum follows the reference EmitBlTree argument. The lower
6bound two reflects the actual loop; a four-code header needs a used rank at
7least three, established separately from the caller's constructed trees.
8-/
9
10namespace Zlib.Trees.Proofs.Math
11
12def blMaxIdx (used : Nat → Bool) : Nat → Nat
13  | 0 => 0
14  | m + 1 => if m + 1 < 3 then m + 1 else if used (m + 1) then m + 1 else blMaxIdx used m
15
16theorem blMaxIdx_le (used : Nat → Bool) (m : Nat) : blMaxIdx used m ≤ m := by
17  induction m with
18  | zero => exact Nat.le_refl _
19  | succ m ih => unfold blMaxIdx; split <;> (try split) <;> omega
20
21theorem blMaxIdx_ge (used : Nat → Bool) (m : Nat) (hm : 2 ≤ m) : 2 ≤ blMaxIdx used m := by
22  induction m with
23  | zero => omega
24  | succ m ih =>
25    unfold blMaxIdx
26    split
27    · omega
28    · split
29      · omega
30      · exact ih (by omega)
31
32theorem blMaxIdx_step (used : Nat → Bool) (m : Nat) (hm : 3 ≤ m) :
33    blMaxIdx used m = if used m then m else blMaxIdx used (m - 1) := by
34  rw [show m = (m - 1) + 1 by omega]
35  simp only [blMaxIdx, ite_eq_right (show ¬ m - 1 + 1 < 3 by omega)]
36  simp only [Nat.add_sub_cancel]
37
38/-- Every rank omitted by the returned index has zero length. -/
39theorem blMaxIdx_suffix (used : Nat → Bool) (m k : Nat)
40    (hk : blMaxIdx used m < k) (hkm : k ≤ m) : used k = false := by
41  induction m with
42  | zero => have := blMaxIdx_le used 0; omega
43  | succ m ih =>
44    simp only [blMaxIdx] at hk
45    split at hk
46    · omega
47    · split at hk
48      · omega
49      · rename_i hu
50        by_cases heq : k = m + 1
51        · subst k; exact Bool.eq_false_iff.mpr hu
52        · exact ih hk (by omega)
53
54/-- A used rank at least three forces enough transmitted header entries. -/
55theorem blMaxIdx_ge_of_used (used : Nat → Bool) (m k : Nat)
56    (hk3 : 3 ≤ k) (hkm : k ≤ m) (hu : used k = true) : k ≤ blMaxIdx used m := by
57  by_cases hle : k ≤ blMaxIdx used m
58  · exact hle
59  · have hf := blMaxIdx_suffix used m k (by omega) hkm
60    rw [hu] at hf
61    contradiction
62
63end Zlib.Trees.Proofs.Math
ZLIB × LEAN

全局目录

当前位置DeflateBlIndex.lean