Skip to content

Commit de271ab

Browse files
committed
proved!
1 parent c455bb5 commit de271ab

File tree

1 file changed

+69
-68
lines changed

1 file changed

+69
-68
lines changed

src/Init/Data/BitVec/Lemmas.lean

Lines changed: 69 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -3455,80 +3455,81 @@ theorem append_assoc_left {a b c : Nat} (x : BitVec a) (y : BitVec b) (z : BitVe
34553455
· simp [h₂]
34563456
rw [Nat.sub_sub, Nat.add_comm (n := c)]
34573457

3458-
theorem cast_heq {n w : Nat} {eq : w = n} {x : BitVec w} :
3459-
HEq (cast eq x) x := by
3460-
3461-
sorry
3462-
3463-
theorem heq_cast_right {α β β' : Sort _} (a : α) (b : β) {h : β = β'} :
3464-
HEq a (cast h b) = HEq a b :=
3465-
by
3466-
apply propext;
3467-
constructor
3468-
<;> intro premise;
3469-
. have : HEq (cast h b) b := cast_heq _ _
3470-
apply HEq.trans _ this;
3471-
assumption;
3472-
. apply HEq.trans premise;
3473-
apply HEq.symm;
3474-
apply cast_heq;
3475-
3476-
theorem heq_cast_left {n w : Nat} {eq : w = n} {x : BitVec w} :
3477-
HEq (cast eq x) x = HEq x x :=
3478-
by
3479-
apply propext;
3480-
constructor
3481-
<;> intro premise;
3482-
. have : HEq x (cast eq x) := HEq.symm cast_heq eq x
3483-
apply HEq.trans this;
3484-
assumption;
3485-
. apply HEq.trans _ premise;
3486-
apply cast_heq;
3487-
3488-
theorem append_replicate_comm {n w : Nat} {x : BitVec w} :
3489-
HEq (replicate n x ++ x) (x ++ replicate n x) := by
3490-
induction n
3491-
case zero =>
3492-
simp; apply cast_heq
3493-
case succ n ih =>
3494-
rw [replicate_succ_eq, ← cast_append_left (by simp only [Nat.add_comm, Nat.mul_succ]), ← cast_append_right (by simp only [Nat.mul_succ,
3495-
Nat.add_comm])]
3496-
apply HEq.trans (cast_heq ..)
3497-
symm
3498-
apply HEq.trans (cast_heq ..)
3499-
symm
3500-
rw [append_assoc_left]
3501-
apply HEq.trans (cast_heq ..)
3502-
congr 2
3503-
<;> omega
3458+
@[simp]
3459+
theorem replicate_one {w : Nat} {x : BitVec w} (h : w = w * 1 := by omega) :
3460+
(x.replicate 1) = x.cast h := by simp [replicate, h]
3461+
3462+
theorem replicate_append_replicate_eq {w n : Nat} {x : BitVec w} (h : w * (n + m) = w * n + w * m := by omega) :
3463+
x.replicate n ++ x.replicate m = (x.replicate (n + m)).cast h := by
3464+
apply BitVec.eq_of_getLsbD_eq
3465+
simp only [getLsbD_cast, getLsbD_replicate, getLsbD_append, getLsbD_replicate]
3466+
intros i
3467+
by_cases h₀ : i < w * m <;> by_cases h₁ : i < w * (n + m)
3468+
· simp only [h₀, decide_true, Bool.true_and, cond_true, h₁]
3469+
· rw [Nat.mul_add] at h₁
3470+
simp only [h₀, decide_true, Bool.true_and, cond_true, Bool.iff_and_self, decide_eq_true_eq]
3471+
omega
3472+
· have h₂ : i ≥ w * m := by omega
3473+
simp only [h₀, decide_false, Bool.false_and, show i - w * m < w * n by omega, decide_true,
3474+
Bool.true_and, cond_false, h₁]
3475+
congr 1
3476+
rw [Nat.sub_mul_mod (by omega)]
3477+
· simp only [h₀, decide_false, Bool.false_and, cond_false, h₁, Bool.and_eq_false_imp,
3478+
decide_eq_true_eq]
3479+
omega
3480+
3481+
35043482

35053483
@[simp]
35063484
theorem getMsbD_replicate {n w : Nat} (x : BitVec w) :
35073485
(x.replicate n).getMsbD i =
35083486
(decide (i < w * n) && x.getMsbD (i % w)) := by
3509-
induction n generalizing x
3510-
case zero => simp
3511-
case succ n ih =>
3512-
rw [replicate_succ_eq, ← append_replicate_comm]
3513-
simp only [append_def, getMsbD_or, getMsbD_shiftLeftZeroExtend, ih, getMsbD_setWidth',
3514-
ge_iff_le]
3515-
have h_w : w * (n + 1) - w = w * n := by
3516-
rw [Nat.mul_succ, Nat.add_sub_cancel]
3517-
rw [h_w]
3518-
by_cases h : i < w * n
3519-
· simp only [h, decide_true, Bool.true_and, show ¬w * n ≤ i by omega, decide_false,
3520-
Bool.false_and, Bool.or_false, Bool.iff_and_self, decide_eq_true_eq]
3521-
intro; omega
3522-
· by_cases h' : i < w * (n + 1)
3523-
· simp [h, h', ih, show w * n ≤ i by omega]
3524-
rw [Nat.sub_mul_eq_mod_of_lt_of_le (n := n) (by omega) (by omega)]
3525-
· have h_iwn : i - w * n ≥ w := by
3526-
by_cases h'' : i = w * (n + 1)
3527-
· simp [h'', Nat.mul_succ, Nat.add_comm]
3528-
· simp [show i > w * (n + 1) by omega]
3529-
rw [Nat.mul_succ] at h'
3487+
simp [getMsbD_eq_getLsbD]
3488+
by_cases h₀ : 0 < w
3489+
· by_cases h₁ : i < w * n <;> by_cases h₂ : n = 0
3490+
· simp [h₁, h₂]
3491+
· simp [h₁, h₂, show w * n - 1 - i < w * n by omega, Nat.mod_lt i h₀]
3492+
congr 1
3493+
induction n
3494+
case neg.e_i.zero => omega
3495+
case neg.e_i.succ n ih =>
3496+
simp_all [Nat.mul_add]
3497+
by_cases h₃ : i < w * n
3498+
· simp [show w * n + w - 1 -i = w + (w * n - 1 - i) by omega]
3499+
rw [ih (by omega)]
3500+
intros hcontra
3501+
subst hcontra
3502+
simp at h₃
3503+
· rw [Nat.mod_eq_of_lt]
3504+
· have := Nat.mod_add_div i w
3505+
have hiw : i / w = n := by
3506+
apply Nat.div_eq_of_lt_le
3507+
· rw [Nat.mul_comm]
3508+
omega
3509+
· rw [Nat.add_mul]
3510+
simp
3511+
rw [Nat.mul_comm]
3512+
omega
3513+
rw [hiw] at this
3514+
conv =>
3515+
lhs
3516+
rw [← this]
35303517
omega
3531-
simp [h, h', h_iwn, show i ≥ w * (n + 1) by omega]
3518+
· omega
3519+
· simp [h₁, h₂]
3520+
· simp [h₁, h₂]
3521+
· simp [show w = 0 by omega]
3522+
3523+
@[simp]
3524+
theorem msb_replicate {n w : Nat} (x : BitVec w) :
3525+
(x.replicate n).msb =
3526+
(decide (0 < n) && x.msb) := by
3527+
simp [BitVec.msb, getMsbD_replicate]
3528+
by_cases hn : 0 < n <;> by_cases hw : 0 < w
3529+
· simp [hn, hw]
3530+
· simp [show w = 0 by omega]
3531+
· simp [hn, hw]
3532+
· simp [show w = 0 by omega, show n = 0 by omega]
35323533

35333534
theorem append_assoc {x₁ : BitVec w₁} {x₂ : BitVec w₂} {x₃ : BitVec w₃} :
35343535
(x₁ ++ x₂) ++ x₃ = (x₁ ++ (x₂ ++ x₃)).cast (by omega) := by

0 commit comments

Comments
 (0)