lean4-htt/tests/lean/run/issue3212.lean
Joachim Breitner 64688d4cee
fix: let induction handle parameters (#3256)
The induction principle used by `induction` may have explicit parameters
that are
not motive, target or “real” alternatives (that have the `motive` as
conclusion), e.g. restrictions on the `motive` or other parameters.

Previously, `induction` would treat them as normal alternatives, and try
to re-introduce the automatically reverted hypotheses. But this only
works when the `motive` is actually the conclusion in the type of that
alternative.

We now pay attention to that, thread that information through, and only
revert when needed.

Fixes #3212.
2024-02-06 20:32:12 +00:00

60 lines
1.9 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

namespace SillyParam
set_option linter.unusedVariables false in
theorem nat_rec_with_string (some_param : String) {motive : Nat → Prop}
(zero : motive .zero) (succ : ∀ n, motive n → motive (.succ n)) : ∀ n, motive n :=
@Nat.rec motive zero succ
example (n m : Nat) (h : n ≠ zero) : Nat.add m n ≠ zero := by
induction n using nat_rec_with_string
case some_param =>
show String
exact "heh"
case zero => sorry
case succ => sorry
end SillyParam
namespace RestrictedMotive
axiom Restriction : (Nat → Prop) → Prop
axiom restricted_induction {motive : Nat → Prop} (h : Restriction motive)
(zero : motive .zero) (succ : ∀ n, motive n → motive (.succ n)) : ∀ n, motive n
example (n m : Nat) (h : n ≠ zero) : Nat.add m n ≠ zero := by
induction n using restricted_induction
case h =>
show Restriction _
sorry
case zero => sorry
case succ => sorry
end RestrictedMotive
namespace DownInduction
axiom down_induction {motive : Nat → Prop} (u : Nat) (x : Nat)
(le_u : x ≤ u) (start : motive u) (step : ∀ x, x < u → motive (x + 1) → motive x) : motive x
example (n m : Nat) (h : m * m < 100) (h2 : n ≤ m) : n * n < 100 := by
induction n using down_induction
case u => exact m -- (could have used `using down_induction (u := m)` of course)
case le_u =>
-- This does not work as hoped for yet: `induction` will revert `h2`, because it mentions `n`,
-- but wed like to keep it outside of the motive here.
sorry
case start => exact h
case step x hlt IH =>
have IH := IH hlt
sorry
-- Unfortunately, this doesnt work either:
-- example (n m : Nat) (h : m * m < 100) (h2 : n ≤ m) : n * n < 100 := by
-- induction n using down_induction (le_u := h2)
-- because after this, the target `n` is no longer a universally qualified variable
--
-- This probably could be made to work with a bit more refactoring.
end DownInduction