This primitive is used by the `exact` tactic. This issue allowed users to create loops in the metavariable assignment. closes #4773
35 lines
1.1 KiB
Text
35 lines
1.1 KiB
Text
import Lean
|
|
|
|
open Lean Elab Tactic in
|
|
elab "exact_false" : tactic =>
|
|
closeMainGoal `exact_false (mkConst ``Bool.false)
|
|
|
|
def f (b : Bool := by exact_false) : Nat := bif b then 1 else 0
|
|
|
|
example : f false = bif false then 1 else 0 := by rw [f]
|
|
example : f true = bif true then 1 else 0 := by rw [f]
|
|
example (b : Bool) : f b = bif b then 1 else 0 := by rw [f]
|
|
|
|
def g (x : Nat) (b : Bool := by exact_false) : Nat :=
|
|
match x with
|
|
| 0 => bif b then 1 else 0
|
|
| x+1 => g x b + 1
|
|
|
|
example : g (x+1) true = g x true + 1 := by rw [g]
|
|
example : g (x+1) false = g x false + 1 := by rw [g]
|
|
example : g (x+1) = g x false + 1 := by rw [g]
|
|
example : g (x+1) b = g x b + 1 := by rw [g]
|
|
|
|
def foo (x n : Nat) (b : Bool := by exact_false) : Nat :=
|
|
if _ : x < n then
|
|
foo (x+1) n b + 1
|
|
else
|
|
g x b
|
|
termination_by n - x
|
|
|
|
example : foo x n true = if _ : x < n then foo (x+1) n true + 1 else g x true := by
|
|
rw [foo]
|
|
example : foo x n b = if _ : x < n then foo (x+1) n b + 1 else g x b := by
|
|
rw [foo]
|
|
example : foo x n false = if _ : x < n then foo (x+1) n false + 1 else g x false := by
|
|
rw [foo]
|