|
| 1 | +module |
| 2 | + |
| 3 | +prelude |
| 4 | +import Init.Core |
| 5 | +import Init.Data.Nat.Basic |
| 6 | +import Init.Data.Option.Basic |
| 7 | + |
| 8 | +class Succ? (α : Type u) where |
| 9 | + succ? : α → Option α |
| 10 | + succAtIdx? (n : Nat) (a : α) : Option α := Nat.repeat (· >>= succ?) n (some a) |
| 11 | + |
| 12 | +class LawfulSucc? (α : Type u) [Succ? α] where |
| 13 | + succAtIdx?_zero {a : α} : Succ?.succAtIdx? 0 a = some a |
| 14 | + succAtIdx?_succ {a : α} : Succ?.succAtIdx? (n + 1) a = Succ?.succAtIdx? n a >>= Succ?.succ? |
| 15 | + |
| 16 | +class LawfulLESucc? (α : Type u) [LE α] [Succ? α] where |
| 17 | + le_rfl : {a : α} → a ≤ a |
| 18 | + le_succ? : {a b : α} → Succ?.succ? a = some b → a ≤ b |
| 19 | + le_succ?_of_le : {a b c : α} → a ≤ b → (h : Succ?.succ? b = some c) → a ≤ c |
| 20 | + le_succAtIdx?_of_le : {a b c : α} → {n : Nat} → a ≤ b → (h : Succ?.succAtIdx? n b = some c) → a ≤ c |
| 21 | + |
| 22 | +class LawfulLTSucc? [LT α] [Succ? α] where |
| 23 | + lt_succ? : {a b : α} → (h : Succ?.succ? a = some b) → a < b |
| 24 | + lt_succ?_of_lt : {a b c : α} → a < b → (h : Succ?.succ? b = some c) → a < c |
| 25 | + |
| 26 | +class HasDownwardUnboundedRanges (α : Type u) where |
| 27 | + min : α |
| 28 | + |
| 29 | +instance : Succ? Nat where |
| 30 | + succ? n := some (n + 1) |
| 31 | + succAtIdx? k n := some (n + k) |
| 32 | + |
| 33 | +instance : LawfulSucc? Nat where |
| 34 | + succAtIdx?_zero := by simp [Succ?.succAtIdx?] |
| 35 | + succAtIdx?_succ := by simp [Succ?.succAtIdx?, Succ?.succ?, Bind.bind, Nat.add_assoc] |
| 36 | + |
| 37 | +instance : LawfulLESucc? Nat where |
| 38 | + le_rfl := Nat.le_refl _ |
| 39 | + le_succ? := sorry |
| 40 | + le_succ?_of_le hle h := by |
| 41 | + simp only [Succ?.succ?, Option.some.injEq] at h |
| 42 | + rw [← h] |
| 43 | + exact Nat.le_trans hle (Nat.le_succ _) |
| 44 | + le_succAtIdx?_of_le {a b c n} hle h := by |
| 45 | + simp only [Succ?.succAtIdx?, Option.some.injEq] at h |
| 46 | + rw [← h] |
| 47 | + exact Nat.le_trans hle (Nat.le_add_right _ _) |
| 48 | + |
| 49 | +#print instLawfulLESucc?Nat._proof_2 |
0 commit comments