Zulip Chat Archive
Stream: new members
Topic: move_oper HAnd.hAnd?
Markus Schmaus (Nov 23 2023 at 15:41):
I just discovered docs#MoveAdd, and the documentation claims that move_oper supports and. However I can't make it work:
import Mathlib
example (a b c : Prop) : a ∧ b ∧ c = c ∧ b ∧ a := by
move_oper HAnd.hAnd [a, b, c]
rfl
BesidesHAnd.hAnd I also tried And.and, And.intro, and, and maybe one or two more, but nothing works. Is it possible to make this tactic work?
Damiano Testa (Nov 23 2023 at 15:42):
Does putting round brackets around the name work?
Damiano Testa (Nov 23 2023 at 15:43):
I'm on mobile, so I won't be able to help until tomorrow, but it should work.
Damiano Testa (Nov 23 2023 at 15:44):
Actually, this line
https://github.com/leanprover-community/mathlib4/blob/master/test/MoveAdd.lean#L64
Suggests that it should "just work"...
Alex J. Best (Nov 23 2023 at 15:45):
Your goal is parsing as
example (a b c : Prop) : a ∧ (b ∧ c = c ∧ b ∧ a) := by
this is one of the reasons why its good to use iff for props
example (a b c : Prop) : a ∧ b ∧ c ↔ c ∧ b ∧ a := by
Alex J. Best (Nov 23 2023 at 15:46):
Turning off notation we can see that the and symbol actually means And not HAnd.hand, and indeed
import Mathlib
set_option pp.notation false -- toggle this to see
example (a b c : Prop) : a ∧ b ∧ c ↔ c ∧ b ∧ a := by
move_oper And [a, b, c]
rfl
works
Damiano Testa (Nov 23 2023 at 15:58):
I'm glad that this works, since it might be the first "real world" use of move_oper that isn't about addition or multiplication!
Damiano Testa (Nov 23 2023 at 16:11):
Also, once I'm back at a computer, I'll update the docs to specify exactly what to type to get move_oper working: right now, it mentions HAdd.hAdd twice, uses and instead of And and I'm not sure if the min/max are correct either.
Markus Schmaus (Nov 23 2023 at 16:35):
One curious note: move_oper And arranges the terms left-associative, which makes sense for +, while the standard for ∧ is right-associative. I will look into move_oper And and see how helpful it is with the kind of proofs, I'm currently encountering.
Damiano Testa (Nov 23 2023 at 18:39):
move_oper was really written thinking of moving additions. Since immediately there were questions about multiplication, I decided to do it operation-agnostic. Once I had it agnostic, I thought of adding support for more operations that are associative and commutative. Thus, and was really an after-thought. An early version supported inf and sup, but since it required a new import, I removed it.
Damiano Testa (Nov 23 2023 at 18:39):
Anyway, making and associate differently is probably a tiny change.
Markus Schmaus (Nov 23 2023 at 22:09):
What I'm really interested in is moving ∃ and statements of the form a' = a, such that docs#exists_eq_left can be used, move_oper And is a start. Now that I know it works, I will have a look at the code and see if I can figure out how it works and if I can adapt it.
Damiano Testa (Nov 23 2023 at 22:21):
I don't remember how much move_oper enters into binders. My recollection is "not much", especially since I do not think that you can name explicitly the bound variables: they may only be accessible via metavariables and relations among them.
Damiano Testa (Nov 23 2023 at 22:22):
If you have a specific example where move_oper might work, but does not, please post it and I will see what can be done about it.
Damiano Testa (Nov 24 2023 at 06:26):
#8606 corrects the doc-strings and adds tests to show how to use move_oper for operations other than + and *.
Damiano Testa (Nov 24 2023 at 06:28):
I'll take a look at associating and/or differently, though this is a change that affects the actual internals.
Damiano Testa (Nov 24 2023 at 07:54):
#8607 adds support for left-associative operations. In the PR, it is only turned on for And/Or.
Last updated: May 02 2025 at 03:31 UTC