Zulip Chat Archive
Stream: new members
Topic: How to control the terms unfolded by `#reduce`?
Qiyuan Zhao (Jul 03 2024 at 10:34):
In the code below, my intention is to use #reduce to get rid of foo.match_1 and to expose the recursor of Thing. However, #reduce will also unfold List.map.
Is it possible for me to control the terms that will be affected by #reduce? In Coq, I can use Eval cbn delta [...] to control; I also wonder if there is anything similar in Lean.
Thanks!
-- Lean version for this: v4.8.0
inductive Thing where
| aa : Thing
| bb (a : List Nat) : Thing
def foo (t : Thing) :=
match t with
| .aa => []
| .bb l => List.map (fun x => x + 1) l
#print foo
/-
output:
def foo : Thing → List Nat :=
fun t => foo.match_1 (fun t => List Nat) t (fun _ => List.nil) fun l => List.map (fun x => HAdd.hAdd x 1) l
-/
#reduce foo
/-
output:
fun t =>
Thing.rec []
(fun a =>
(List.rec ⟨[], PUnit.unit⟩ (fun head tail tail_ih => ⟨head.succ :: tail_ih.1, ⟨tail_ih, PUnit.unit⟩⟩) a).1)
t
-/
Kyle Miller (Jul 03 2024 at 17:24):
This sort of is what you're asking, but it makes use of the simp tactic rather than reduction.
import Mathlib
inductive Thing where
| aa : Thing
| bb (a : List Nat) : Thing
def foo (t : Thing) :=
match t with
| .aa => []
| .bb l => List.map (fun x => x + 1) l
#simp only [foo] => fun t => foo t
/-
fun t ↦
match t with
| Thing.aa => []
| Thing.bb l => List.map (fun x ↦ x + 1) l
-/
Kyle Miller (Jul 03 2024 at 17:25):
It would be possible to write your own #reduce (or #whnf) that only unfolds certain terms.
Last updated: May 02 2025 at 03:31 UTC