`simp only` will not apply this simproc anymore. Users must now write `simp only [reduceCtorEq]`. See RFC #5046 for motivation. This PR also renames simproc to `reduceCtorEq`. close #5046 @semorrison A few `simp only ...` tactics will probably break in Mathlib. Fix: include `reduceCtorEq`.
41 lines
858 B
Text
41 lines
858 B
Text
namespace Ex1
|
|
mutual
|
|
def f : Nat → Bool → Nat
|
|
| n, true => 2 * f n false
|
|
| 0, false => 1
|
|
| n, false => n + g n
|
|
termination_by n b => (n, if b then 2 else 1)
|
|
decreasing_by
|
|
· apply Prod.Lex.right; simp -- decide TODO: add `reduceCtorEq` at `clean_wf` after update-stage0
|
|
· apply Prod.Lex.right; simp -- decide
|
|
|
|
def g (n : Nat) : Nat :=
|
|
if h : n ≠ 0 then
|
|
f (n-1) true
|
|
else
|
|
n
|
|
termination_by (n, 0)
|
|
decreasing_by
|
|
apply Prod.Lex.left
|
|
apply Nat.pred_lt
|
|
done -- should fail
|
|
end
|
|
end Ex1
|
|
|
|
|
|
namespace Ex2
|
|
mutual
|
|
def f : Nat → Bool → Nat
|
|
| n, true => 2 * f n false
|
|
| 0, false => 1
|
|
| n, false => n + g (n+1) -- Error
|
|
termination_by n b => (n, if b then 2 else 1)
|
|
|
|
def g (n : Nat) : Nat :=
|
|
if h : n ≠ 0 then
|
|
f (n-1) true
|
|
else
|
|
n
|
|
termination_by (n, 0)
|
|
end
|
|
end Ex2
|