Zulip Chat Archive

Stream: general

Topic: notation question


Kevin Buzzard (May 06 2018 at 11:30):

The following might be impossible in Lean but I thought I'd ask. It's just an issue with notation.

Kevin Buzzard (May 06 2018 at 11:30):

variables {S : Type} (R : S  S  Prop)
local infix `` : 50 := R

definition euclidean₁ :=  {{x y z : S}}, x  y  x  z  y  z
definition euclidean₂ (R : S  S  Prop) :=  {{x y z : S}}, R x y  R x z  R y z
definition euclidean₃ (R : S  S  Prop) :=  {{x y z : S}}, x  y  x  z  y  z

Kevin Buzzard (May 06 2018 at 11:30):

(\heartsuit gives the heart, by the way)

Kevin Buzzard (May 06 2018 at 11:31):

So mathematicians would normally _define_ a new relation with the infix notation, in contrast to functional programmers who want to define R first and then set up infix notation for it.

Kevin Buzzard (May 06 2018 at 11:31):

This has the following annoying-for-mathematicians consequence.

Kevin Buzzard (May 06 2018 at 11:32):

Definition 1 above is not so great because you can't see what you are defining -- it should say "euclidean1 heartsuit" or something.

Kevin Buzzard (May 06 2018 at 11:32):

Definition 2 is correct, but doesn't use the notation, so mathematicians are left wondering why we have R x y instead of x R y or x heartsuit y

Kevin Buzzard (May 06 2018 at 11:32):

(infix notation is more normal in mathematics than CS perhaps)

Kevin Buzzard (May 06 2018 at 11:33):

And definition 3 is wrong because the heart in the definition is unrelated to the R -- the heart is attached to the variable R and definition 3 introduces a new one.

Kevin Buzzard (May 06 2018 at 11:33):

My dream is

Kevin Buzzard (May 06 2018 at 11:34):

definition euclidean_dream (R) := ∀ {{x y z : S}}, x ♥ y → x ♥ z → y ♥ z

Kevin Buzzard (May 06 2018 at 11:34):

but of course that doesn't even typecheck

Kevin Buzzard (May 06 2018 at 11:34):

Is there any way I can make my dream definition typecheck?

Kevin Buzzard (May 06 2018 at 11:34):

Actually I guess my dream is the impossible:

Kevin Buzzard (May 06 2018 at 11:34):

definition euclidean_dream ♥ := ∀ {{x y z : S}}, x ♥ y → x ♥ z → y ♥ z

Kevin Buzzard (May 06 2018 at 11:36):

I don't mind a few incomprehensible lines with set-up beforehand, my question I guess is simply whether I can introduce a local variable in a definition and instantly have access to notation for it.

Sebastian Ullrich (May 06 2018 at 11:51):

@Kevin Buzzard Something like this proposal? https://github.com/leanprover/lean/issues/1522#issuecomment-294872715

Kevin Buzzard (May 06 2018 at 12:01):

Yes! I didn't mention it in my posts above but I did try to do this with the type class notation types (indeed I wrote has_heart :-) ) but I couldn't get that to work either because definition blah (S : Type) (R : S -> S -> Prop) [has_heart S] wouldn't attach the heart to R and I couldn't figure out how to make the attachment whilst keeping it all looking clean and uncluttered. I am currently thinking a lot about trying to write code which looks really clean to mathematicians, who we can think of here as people who know exactly what a transitive binary relation is but have no idea what a typeclass is and don't want to see clutter when they are actually doing or reading mathematics in Lean.

Reid Barton (May 06 2018 at 13:44):

In Haskell you can convert an infix operator to an ordinary (prefix) function by surrounding the operator in parentheses. You can also use this notation at a binding site.
The hypothetical Lean equivalent would be

definition euclidean {S : Type} (() : S  S  Prop) :=  {{x y z : S}}, x  y  x  z  y  z

Kevin Buzzard (May 06 2018 at 14:45):

Lean would need to be told the associativity and left binding power, or at least default options for such things.


Last updated: Dec 20 2023 at 11:08 UTC