lean4-htt/tests/elab_fail/termination_by_vars.lean
Garmelon 08eb78a5b2
chore: switch to new test/bench suite (#12590)
This PR sets up the new integrated test/bench suite. It then migrates
all benchmarks and some related tests to the new suite. There's also
some documentation and some linting.

For now, a lot of the old tests are left alone so this PR doesn't become
even larger than it already is. Eventually, all tests should be migrated
to the new suite though so there isn't a confusing mix of two systems.
2026-02-25 13:51:53 +00:00

135 lines
3.5 KiB
Text

/-!
Here we test that lean correctly complains if `termination_by` has too many variables,
and that it does the right thing if it has fewer variables.
-/
opaque dec1 : Nat → Nat
axiom dec1_lt (n : Nat) : dec1 n < n
opaque dec2 : Nat → Nat
axiom dec2_lt (n : Nat) : dec2 n < n
namespace Basic
def tooManyVars (n : Nat) : Nat := tooManyVars (dec1 n)
termination_by x => x -- Error
decreasing_by apply dec1_lt
def okVariables1 (n : Nat) : Nat := okVariables1 (dec1 n)
termination_by n
decreasing_by apply dec1_lt
def blankArrow (n : Nat) : Nat := blankArrow (dec1 n)
termination_by => x -- Error
decreasing_by apply dec1_lt
def fewerVariables1 (n : Nat) : Nat → Nat → Nat := fun a b => fewerVariables1 (dec2 n) a (dec1 b)
termination_by n -- Not an error
decreasing_by apply dec2_lt
def fewerVariables2 (n : Nat) : Nat → Nat → Nat := fun a b => fewerVariables2 n (dec1 a) (dec2 b)
termination_by a => a
decreasing_by apply dec1_lt -- NB: dec2_lt would no work
def okVariables2 (n : Nat) : Nat → Nat → Nat := fun a b => okVariables2 n (dec1 a) (dec2 b)
termination_by a b => b
decreasing_by apply dec2_lt
def tooManyVariables2 (n : Nat) : Nat → Nat → Nat := fun a b => tooManyVariables2 n (dec1 a) (dec2 b)
termination_by a b c => b
decreasing_by apply dec1_lt
end Basic
namespace WithVariable
variable (v : Nat)
def tooManyVars (n : Nat) : Nat := tooManyVars (dec1 n) + v
termination_by x => x -- Error
decreasing_by apply dec1_lt
def okVariables1 (n : Nat) : Nat := okVariables1 (dec1 n) + v
termination_by n
decreasing_by apply dec1_lt
def blankArrow (n : Nat) : Nat := blankArrow (dec1 n) + v
termination_by => x -- Error
decreasing_by apply dec1_lt
def fewerVariables1 (n : Nat) : Nat → Nat → Nat := fun a b =>
fewerVariables1 (dec2 n) a (dec1 b) + v
termination_by n
decreasing_by apply dec2_lt
def fewerVariables2 (n : Nat) : Nat → Nat → Nat := fun a b =>
fewerVariables2 n (dec1 a) (dec2 b) + v
termination_by a => a
decreasing_by apply dec1_lt
def okVariables2 (n : Nat) : Nat → Nat → Nat := fun a b =>
okVariables2 n a (dec1 b) + v
termination_by a b => b
decreasing_by apply dec1_lt
end WithVariable
namespace InLetRec
def foo1 (v : Nat) := 5
where
tooManyVars (n : Nat) : Nat := tooManyVars (dec1 n) + v
termination_by x => x -- Error
decreasing_by apply dec1_lt
def foo2 (v : Nat) := 5
where
okVariables1 (n : Nat) : Nat := okVariables1 (dec1 n) + v
termination_by n
decreasing_by apply dec1_lt
def foo3 (v : Nat) := 5
where
blankArrow (n : Nat) : Nat := blankArrow (dec1 n) + v
termination_by => x -- Error
decreasing_by apply dec1_lt
def foo4 (v : Nat) := 5
where
fewerVariables1 (n : Nat) : Nat → Nat → Nat := fun a b =>
fewerVariables1 (dec2 n) a (dec1 b) + v
termination_by n
decreasing_by apply dec2_lt
def foo5 (v : Nat) := 5
where
fewerVariables2 (n : Nat) : Nat → Nat → Nat := fun a b =>
fewerVariables2 n (dec1 a) (dec2 b) + v
termination_by a => a
decreasing_by apply dec1_lt
def foo6 (v : Nat) := 5
where
okVariables2 (n : Nat) : Nat → Nat → Nat := fun a b =>
okVariables2 n a (dec1 b) + v
termination_by a b => b
decreasing_by apply dec1_lt
end InLetRec
namespace ManyTooMany
def tooManyVars (n : Nat) : Nat := tooManyVars (dec1 n)
termination_by x y z => x -- Error
decreasing_by apply dec1_lt
end ManyTooMany
namespace WithHelpfulComment
def foo (n : Nat) : Nat := foo (dec1 n)
termination_by foo n => n -- Error
decreasing_by apply dec1_lt
end WithHelpfulComment