This will collect definitions from Std.Logic --------- Co-authored-by: David Thrane Christiansen <david@davidchristiansen.dk> Co-authored-by: Scott Morrison <scott.morrison@gmail.com>
44 lines
1.7 KiB
Text
44 lines
1.7 KiB
Text
@[inline] def decidable_of_iff'' {b : Prop} (a : Prop) (h : a ↔ b) [Decidable a] : Decidable b :=
|
||
decidable_of_decidable_of_iff h
|
||
|
||
theorem LE.le.lt_or_eq_dec {a b : Nat} (hab : a ≤ b) : a < b ∨ a = b :=
|
||
by cases hab
|
||
· exact .inr rfl
|
||
· refine .inl ?_ ; refine Nat.succ_le_succ ?_ ; assumption
|
||
|
||
section succeeds_using_match
|
||
|
||
local instance decidableBallLT :
|
||
∀ (n : Nat) (P : ∀ k, k < n → Prop) [∀ n h, Decidable (P n h)], Decidable (∀ n h, P n h)
|
||
| 0, _, _ => isTrue fun _ => (by cases ·)
|
||
| (n+1), P, H =>
|
||
match decidableBallLT n (P · <| Nat.le_succ_of_le ·) with
|
||
| isFalse h => isFalse (h fun _ _ => · _ _)
|
||
| isTrue h =>
|
||
match H n Nat.le.refl with
|
||
| isFalse p => isFalse (p <| · _ _)
|
||
| isTrue p => isTrue fun _ h' => (Nat.le_of_lt_succ h').lt_or_eq_dec.elim (h _) (· ▸ p)
|
||
|
||
set_option maxHeartbeats 5000
|
||
example : ∀ a, a < 9 → ∀ b, b < 9 → ∀ c, c < 9 → a ^ 2 + b ^ 2 + c ^ 2 ≠ 7 := by decide
|
||
|
||
end succeeds_using_match
|
||
|
||
section fails_with_timeout
|
||
|
||
-- we change `match decidableBallLT` to `by cases decidableBallLT' ... exact`:
|
||
local instance decidableBallLT' :
|
||
∀ (n : Nat) (P : ∀ k, k < n → Prop) [∀ n h, Decidable (P n h)], Decidable (∀ n h, P n h)
|
||
| 0, _, _ => isTrue fun _ => (by cases ·)
|
||
| (n+1), P, H => by
|
||
cases decidableBallLT' n (P · <| Nat.le_succ_of_le ·) with
|
||
| isFalse h => exact isFalse (h fun _ _ => · _ _)
|
||
| isTrue h =>
|
||
exact match H n Nat.le.refl with
|
||
| isFalse p => isFalse (p <| · _ _)
|
||
| isTrue p => isTrue fun _ h' => (Nat.le_of_lt_succ h').lt_or_eq_dec.elim (h _) (· ▸ p)
|
||
|
||
set_option maxHeartbeats 5000
|
||
example : ∀ a, a < 9 → ∀ b, b < 9 → ∀ c, c < 9 → a ^ 2 + b ^ 2 + c ^ 2 ≠ 7 := by decide
|
||
|
||
end fails_with_timeout
|