FunInd: `fun_induction foo` considers let-bound FVars as atomic
Nobody has claimed this yet.
- Dominant language
- Lean
- Stars
- 9.2k
- Forks
- 990
- Avg merge
- 1d 17h
- Merged PRs (30d)
- 175
Description
In this example, the fun_induction map should not succeed: The target xs in the call to map is no really atomic, it’s just let-extracted:
def map (f : Bool → Bool) : List Bool → List Bool
| [] => []
| x::xs => f x::map f xs
termination_by x => x
example : let xs := List.replicate 4 true; (map f xs).length = xs.length := by
intro xs
fail_if_success fun_induction map
Could be fixed together with #7985 (treating all propositions as atomic).
Versions
Lean 4.20.0-nightly-2025-04-29
Impact
Add 👍 to issues you consider important. If others are impacted by this issue, please ask them to add 👍 to it.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Reproduce the provided example with Lean 4.20.0-nightly-2025-04-29, then start from the fun_induction entry point and compare the behavior with issue #7985. Done means fun_induction map no longer succeeds when the target is a let-extracted local, while the reported example continues to demonstrate the corrected behavior.
Written by the indexing model from the issue text.
Assessment
- Domain
- compilers
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100