Zulip Chat Archive
Stream: lean4
Topic: How to match only types using Qq
Vasilii Nesterov (Feb 16 2025 at 14:33):
When matching some type : Q(Prop)
with $x = $y
how can I filter out the case when x
and y
are Prop
s?
import Qq
open Qq Lean Elab Meta Tactic
elab "print_eqs" : tactic => withMainContext do
for ldecl in ← getLCtx do
let ⟨0, type, expr⟩ := ← inferTypeQ ldecl.toExpr | continue
match type with
| ~q(@Eq $α $x $y) =>
-- Is it possible to filter only α : Q(Type u) here?
logInfo m!"{x} = {y}"
| _ => pure ()
example (a b : Nat) (h1 : a = b) : True := by
have h2 : True = True := rfl
print_eqs
For example, later I'd like to check whether there is an LE α
instance:
let inst ← synthInstanceQ (q(LE $α))
but it is impossible because LE
expects α : Type u
, not α : Sort u
.
Eric Wieser (Feb 16 2025 at 15:42):
Did you mean to test with trivial = trivial
instead?
Eric Wieser (Feb 16 2025 at 15:42):
Matching against ~q(@Eq.{_ + 1} $α $x $y)
seems to work
Eric Wieser (Feb 16 2025 at 15:42):
As does ~q(@Eq ($α : Type _) $x $y)
Robin Arnez (Feb 16 2025 at 15:43):
Also, maybe don't inferTypeQ
here, there is ldecl.type
which should also do what you want.
Yaël Dillies (Feb 16 2025 at 15:46):
Robin, your suggestion does not provide the correct Qq annotations, right?
Robin Arnez (Feb 16 2025 at 15:49):
You're right... but I feel like it's silly to do use an inferType
when the information already exists somewhere.
Vasilii Nesterov (Feb 16 2025 at 15:50):
Thank you very much, Eric!
Eric Wieser (Feb 16 2025 at 15:54):
Note that the let ⟨0,
can fail if the universe is a metavariable
Vasilii Nesterov (Feb 19 2025 at 10:15):
Ah, I see. Is there a better way than
let ⟨u, type, expr⟩ := ← inferTypeQ ldecl.toExpr
if ← isProp type then
have : u =QL 0 := ⟨⟩
-- the rest of the code
?
Last updated: May 02 2025 at 03:31 UTC