Zulip Chat Archive
Stream: metaprogramming / tactics
Topic: Qq/positivity confusion
Moritz Doll (Feb 18 2024 at 03:23):
I've tried to write a positivity extension with Qq and I ran into a weird problem:
import Mathlib.Algebra.Order.Group.PosPart
namespace Mathlib.Meta.Positivity
open Qq Lean Meta LinearOrder
@[positivity PosPart.pos _]
def evalPosPart : PositivityExt where eval {u α} zα pα e := do
match e with
| ~q(@PosPart.pos _ $inst1 $a) =>
let instαLattice ← synthInstanceQ q(Lattice $α)
let instαAddGroup ← synthInstanceQ q(AddGroup $α)
assertInstancesCommute
return .nonnegative q(@posPart_nonneg $α $instαLattice $instαAddGroup $a)
| _ => throwError "not PosPart.pos"
example {α : Type*} [Lattice α] [AddGroup α] (a : α) : 0 ≤ a⁺ := by positivity
end Mathlib.Meta.Positivity
The return
fails with error:
type mismatch
posPart_nonneg «$a»
has type
0 ≤ «$a»⁺ : Prop
but is expected to have type
0 ≤ «$e» : Prop
even though the matching ensures that these two are equal. I don't know how to use the matching hypothesis to make Qq happy and I haven't seen a similar issue in any of the other positivity extensions
Yaël Dillies (Feb 18 2024 at 09:29):
You're using the wrong function?
Yaël Dillies (Feb 18 2024 at 09:29):
See #10256
Yaël Dillies (Feb 18 2024 at 09:30):
Anyway, I have those extensions written. I can PR them
Eric Wieser (Feb 18 2024 at 10:20):
set_option autoImplicit false
makes the error clearer (you're missing the import of PositivityExt
)
Eric Wieser (Feb 18 2024 at 10:26):
To decode Yael's comment, you should be using posPart
not PosPart.pos
Eric Wieser (Feb 18 2024 at 10:26):
So this works:
@[positivity posPart _]
def evalPosPart : PositivityExt where eval {u α} zα pα e := do
match e with
| ~q(@posPart _ $inst1 $inst2 $a) =>
assertInstancesCommute
return .nonnegative q(posPart_nonneg $a)
| _ => throwError "not PosPart.pos"
Yaël Dillies (Feb 18 2024 at 10:27):
Yaël Dillies (Feb 18 2024 at 10:28):
There is a bug here: core q(inferInstance) q(inferInstance) a
fails instead of returning none
when no 0 ≤ a
or 0 < a
assumption is in context.
Moritz Doll (Feb 18 2024 at 12:19):
Thanks you. That was very silly of me.
Moritz Doll (Feb 18 2024 at 12:20):
Yael there are at least two instance where positivity
should be able to replace explicit calls to posPart_nonneg
and a third one where one needs a positivity
-extension for integrals (I wrote a PR for that)
Yaël Dillies (Feb 18 2024 at 14:38):
You mean two occurrences in mathlib? I didn't know posPart
was used at all yet.
Moritz Doll (Feb 18 2024 at 14:43):
yes, in MeasureTheory.Decomposition.Jordan
and Probability.Martingale.Upcrossing
Moritz Doll (Feb 18 2024 at 14:46):
this is how I found posPart
in the first place: I was search&replacing integral_nonneg
and Upcrossing
had these posPart_nonneg
that we not used by positivity
.
Last updated: May 02 2025 at 03:31 UTC