38 lines
956 B
Text
38 lines
956 B
Text
inductive P : Option Nat → Prop
|
||
| none : P .none
|
||
| somePos : x > 0 → P (some x)
|
||
|
||
def Option.get : (a : Option α) → a.isSome → α
|
||
| some a, _ => a
|
||
|
||
theorem aux (x? : Option Nat) (h₁ : P x?) (h₂ : x?.isSome) : x?.get h₂ > 0 := by
|
||
cases h₁ with
|
||
| none => contradiction
|
||
| somePos h => exact h
|
||
|
||
def f (x? : Option Nat) (hp : P x?) : { r? : Option Nat // P r? } :=
|
||
if h₁ : x?.isSome then
|
||
let x := x?.get h₁
|
||
have : x > 0 := by
|
||
cases h₂ : x with
|
||
| zero => have := aux x? hp h₁; simp at h₂; simp [h₂] at this
|
||
| succ x' => simp_arith
|
||
⟨some x, .somePos this⟩
|
||
else
|
||
⟨none, .none⟩
|
||
|
||
def f₁ (x : Nat) : Nat :=
|
||
let y := x + 1
|
||
by cases y with
|
||
| zero => exact 2
|
||
| succ y' => exact 1
|
||
|
||
example : f₁ x = 1 := rfl
|
||
|
||
noncomputable def f₂ (x : Nat) : Nat :=
|
||
let y := x + 1
|
||
by induction y with
|
||
| zero => exact 2
|
||
| succ y' => exact 1
|
||
|
||
example : f₂ x = 1 := rfl
|