15 lines
776 B
Text
15 lines
776 B
Text
-- List decidable equality using `withPtrEqDecEq`
|
||
def listDecEqAux {α} [s : DecidableEq α] : ∀ (as bs : List α), Decidable (as = bs)
|
||
| [], [] => isTrue rfl
|
||
| [], b::bs => isFalse $ fun h => List.noConfusion h
|
||
| a::as, [] => isFalse $ fun h => List.noConfusion h
|
||
| a::as, b::bs =>
|
||
match s a b with
|
||
| isTrue h₁ =>
|
||
match withPtrEqDecEq as bs (fun _ => listDecEqAux as bs) with
|
||
| isTrue h₂ => isTrue $ h₁ ▸ h₂ ▸ rfl
|
||
| isFalse h₂ => isFalse $ fun h => List.noConfusion h $ fun _ h₃ => absurd h₃ h₂
|
||
| isFalse h₁ => isFalse $ fun h => List.noConfusion h $ fun h₂ _ => absurd h₂ h₁
|
||
|
||
instance List.optimizedDecEq {α} [DecidableEq α] : DecidableEq (List α) :=
|
||
fun a b => withPtrEqDecEq a b (fun _ => listDecEqAux a b)
|