| namespace Ex1 | |
| def f (x : Nat) : Nat := by | |
| cases x with | |
| | zero => exact 1 | |
| | succ x' => | |
| apply Nat.mul 2 | |
| exact f x' | |
| #guard f 10 == 1024 | |
| example : f x.succ = 2 * f x := by rw [f]; rfl | |
| end Ex1 | |
| namespace Ex2 | |
| inductive Foo where | |
| | mk : List Foo → Foo | |
| mutual | |
| def g (x : Foo) : Nat := by | |
| cases x with | |
| | mk xs => exact gs xs | |
| def gs (xs : List Foo) : Nat := by | |
| cases xs with | |
| | nil => exact 1 | |
| | cons x xs => | |
| apply Nat.add | |
| exact g x | |
| exact gs xs | |
| end | |
| end Ex2 | |
| namespace Ex3 | |
| inductive Foo where | |
| | a | b | c | |
| | pair: Foo × Foo → Foo | |
| def Foo.deq (a b : Foo) : Decidable (a = b) := by | |
| cases a <;> cases b | |
| any_goals apply isFalse Foo.noConfusion | |
| any_goals apply isTrue rfl | |
| case pair a b => | |
| let (a₁, a₂) := a | |
| let (b₁, b₂) := b | |
| exact match deq a₁ b₁, deq a₂ b₂ with | |
| | isTrue h₁, isTrue h₂ => isTrue (by rw [h₁,h₂]) | |
| | isFalse h₁, _ => isFalse (fun h => by cases h; cases (h₁ rfl)) | |
| | _, isFalse h₂ => isFalse (fun h => by cases h; cases (h₂ rfl)) | |
| end Ex3 |