Zulip Chat Archive
Stream: lean4
Topic: Can I shadow/specify instance to use in def?
Zhuanhao Wu (Apr 21 2024 at 01:11):
In the example, I want to shadow the default LT Nat instance with my sampleInst (i: Info). The catch here is that this instance is dependent on some extra info i, and I'm not sure if default_instance is appropriate.
One thing I tried is useInst, but to use it I have to do the @useInst to pass the instance in the first example.
Is there someway I could achieve the syntax of the second example, but still get sampleInst as LT when defining useInst'?
import Mathlib
structure Info where
s: Nat
instance sampleInst (i: Info) : LT Nat where
lt x y := x + y = i.s
def useInst [inst: LT Nat] : Prop :=
∀(x y: Nat), x < y
-- usage:
example (I: Info): (@useInst (sampleInst I)) := sorry
-- What I want to achieve
def useInst' (I: Info) : Prop := -- some magic code here or in the `def` to make this def use (sampleInst I) as the LT instance for x and y?
∀(x y: Nat), x < y
example (I: Info): (useInst' I) := by sorry -- or some magic here?
Kyle Miller (Apr 21 2024 at 01:22):
You can use explicit binders (def useInst (inst: LT Nat)) and it will use inst inside the body of the function.
You can also write
example (I: Info) : letI inst := sampleInst i; ∀(x y: Nat), x < y := sorry
The I in letI means "inline" — it will substitute in sampleInst i wherever inst is used. If you use let, then it will keep a let expression around.
Zhuanhao Wu (Apr 21 2024 at 13:02):
Thanks, this works!
Last updated: May 02 2025 at 03:31 UTC