Module docstring
{"### isEqv ","### beq "}
{"### isEqv ","### beq "}
List.isEqv_eq_decide
theorem
{as bs : List α} {r : α → α → Bool} :
isEqv as bs r =
if h : as.length = bs.length then decide (∀ (i : Nat) (h' : i < as.length), r (as[i]'(h ▸ h')) (bs[i]'(h ▸ h')))
else false
theorem isEqv_eq_decide {as bs : List α} {r : α → α → Bool} :
isEqv as bs r = if h : as.length = bs.length then
decide (∀ (i : Nat) (h' : i < as.length), r (as[i]'(h ▸ h')) (bs[i]'(h ▸ h'))) else false := by
induction as generalizing bs with
| nil =>
cases bs <;> simp
| cons a as ih =>
cases bs with
| nil => simp
| cons b bs =>
simp only [isEqv, ih, length_cons, Nat.add_right_cancel_iff]
split <;> simp [Nat.forall_lt_succ_left']
List.beq_eq_isEqv
theorem
[BEq α] {as bs : List α} : as.beq bs = isEqv as bs (· == ·)
theorem beq_eq_isEqv [BEq α] {as bs : List α} : as.beq bs = isEqv as bs (· == ·) := by
induction as generalizing bs with
| nil =>
cases bs <;> simp
| cons a as ih =>
cases bs with
| nil => simp
| cons b bs =>
simp only [beq_cons₂, ih, isEqv_eq_decide, length_cons, Nat.add_right_cancel_iff,
Nat.forall_lt_succ_left', getElem_cons_zero, getElem_cons_succ, Bool.decide_and,
Bool.decide_eq_true]
split <;> simp
List.beq_eq_decide
theorem
[BEq α] {as bs : List α} :
(as == bs) =
if h : as.length = bs.length then decide (∀ (i : Nat) (h' : i < as.length), as[i] == bs[i]'(h ▸ h')) else false
theorem beq_eq_decide [BEq α] {as bs : List α} :
(as == bs) = if h : as.length = bs.length then
decide (∀ (i : Nat) (h' : i < as.length), as[i] == bs[i]'(h ▸ h')) else false := by
simp [BEq.beq, beq_eq_isEqv, isEqv_eq_decide]