Zulip Chat Archive
Stream: general
Topic: explode command
Mario Carneiro (Aug 30 2018 at 23:54):
While on the flight home, I decided to actually write the wishlist tactic I've mentioned to a few people, which displays lean proofs in a line by line style heavily annotated with type ascriptions so it looks more like a Fitch style proof. I'm still tweaking the display options, but here's what it looks like right now:
import tactic.explode section end #explode iff_true
iff_true : ∀ (a : Prop), a ↔ true ↔ a 0│ │ a ├ Prop 1│ │ h │ ┌ a ↔ true 2│ │ trivial │ │ true 3│1,2│ iff.mpr │ │ a 4│3 │ ∀I │ (a ↔ true) → a 5│ │ iff_true_intro │ a → (a ↔ true) 6│4,5│ iff.intro │ a ↔ true ↔ a
Johan Commelin (Aug 31 2018 at 04:38):
Ok, I can parse this, and it looks really helpful... but why is line 0
at the top, instead of the bottom?
Mario Carneiro (Aug 31 2018 at 04:38):
it's numbered like lines of proof
Johan Commelin (Aug 31 2018 at 04:39):
It seems to me that 0
follows from 6
, but maybe I misunderstand 0
Johan Commelin (Aug 31 2018 at 04:39):
Also, I'd rather read them upside down.
Mario Carneiro (Aug 31 2018 at 04:39):
lambdas are introduced with the intro variable on top of the bracket
Johan Commelin (Aug 31 2018 at 04:39):
First split the goal, then you get two subtrees... etc..
Mario Carneiro (Aug 31 2018 at 04:40):
Yes, I usually read metamath proofs bottom up as well
Johan Commelin (Aug 31 2018 at 04:40):
Aaah, that is what 0
is doing, of course!
Johan Commelin (Aug 31 2018 at 04:40):
Well... there is a solution to that: have #explode
reverse the order...
Johan Commelin (Aug 31 2018 at 04:40):
But now I see that 0
should remain at the top.
Johan Commelin (Aug 31 2018 at 04:40):
So it's not that easy...
Mario Carneiro (Aug 31 2018 at 04:41):
I suppose, but that will get confusing to explain to people
Mario Carneiro (Aug 31 2018 at 04:41):
I would prefer a forward proof ordering on the page
Mario Carneiro (Aug 31 2018 at 04:41):
even if your interest is drawn from the bottom up
Johan Commelin (Aug 31 2018 at 04:41):
How far is this representation from writing a begin end
proof?
Johan Commelin (Aug 31 2018 at 04:42):
Could you generate that as well?
Mario Carneiro (Aug 31 2018 at 04:42):
what do you mean?
Mario Carneiro (Aug 31 2018 at 04:42):
like you want the lines to correspond to apply
and intro
?
Johan Commelin (Aug 31 2018 at 04:42):
Right.
Johan Commelin (Aug 31 2018 at 04:42):
#deobfuscate
Mario Carneiro (Aug 31 2018 at 04:43):
it's pretty close, there are some edge cases where you see explicit ∀E
and ∀I
steps
Johan Commelin (Aug 31 2018 at 04:44):
Even if it isn't perfect, I'dd really like it.
Mario Carneiro (Aug 31 2018 at 04:45):
can you mockup?
Johan Commelin (Aug 31 2018 at 04:46):
What do you mean? This example? Or more general?
Mario Carneiro (Aug 31 2018 at 04:48):
either, something that shows off what you would like to see
Johan Commelin (Aug 31 2018 at 04:48):
Rob has this interface with mathematica... with certain terms corresponding to certain mathematica terms
Johan Commelin (Aug 31 2018 at 04:49):
So we could also have a dictionary \lam <-> intros
etc...
Johan Commelin (Aug 31 2018 at 04:49):
But I don't have a clear picture how to actually implement this
Mario Carneiro (Aug 31 2018 at 04:50):
oh, there is a potential problem with making a real runnable proof script, as opposed to just a display like this... it has to parse as valid lean, and sometimes pp
doesn't give good results
Mario Carneiro (Aug 31 2018 at 04:50):
I am currently hiding non proof terms in #explode
, but probably this won't work in a proof script
Johan Commelin (Aug 31 2018 at 04:52):
iff_true : ∀ (a : Prop), a ↔ true ↔ a 0│ │ a ├ Prop | intro (intros?) 1│ │ h │ ┌ a ↔ true | intro (intros?) 2│ │ trivial │ │ true | exact trivial 3│1,2│ iff.mpr │ │ a | apply iff.mpr 4│3 │ ∀I │ (a ↔ true) → a | ??? 5│ │ iff_true_intro │ a → (a ↔ true) | exact iff_true_intro 6│4,5│ iff.intro │ a ↔ true ↔ a | apply iff.intro (split?)
Johan Commelin (Aug 31 2018 at 04:54):
I just added an extra column, and it totally wouldn't run.
Mario Carneiro (Aug 31 2018 at 04:54):
I guess part of the problem with line for line translating this display into a proof script is that forward proving is less natural
Mario Carneiro (Aug 31 2018 at 04:55):
you have to use lots of have
Johan Commelin (Aug 31 2018 at 04:55):
Right
Mario Carneiro (Aug 31 2018 at 04:55):
and the positioning of the intro
is weird
Mario Carneiro (Aug 31 2018 at 04:58):
The hard stuff is when dealing with eq.rec
though
iff_not_comm : ∀ {a b : Prop} [_inst_1 : decidable a] [_inst_2 : decidable b], a ↔ ¬b ↔ (b ↔ ¬a) 0 │ │ a ├ Prop 1 │ │ b ├ Prop 2 │ │ _inst_1 ├ decidable a 3 │ │ _inst_2 ├ decidable b 4 │ │ eq.refl │ (a ↔ ¬b ↔ (b ↔ ¬a)) = (a ↔ ¬b ↔ (b ↔ ¬a)) 5 │ │ iff_def │ a ↔ ¬b ↔ (a → ¬b) ∧ (¬b → a) 6 │5 │ propext │ (a ↔ ¬b) = ((a → ¬b) ∧ (¬b → a)) 7 │4,6 │ eq.rec │ (a ↔ ¬b ↔ (b ↔ ¬a)) = ((a → ¬b) ∧ (¬b → a) ↔ (b ↔ ¬a)) 8 │7 │ id │ (a ↔ ¬b ↔ (b ↔ ¬a)) = ((a → ¬b) ∧ (¬b → a) ↔ (b ↔ ¬a)) 9 │ │ eq.refl │ ((a → ¬b) ∧ (¬b → a) ↔ (b ↔ ¬a)) = ((a → ¬b) ∧ (¬b → a) ↔ (b ↔ ¬a)) 10│ │ iff_def │ b ↔ ¬a ↔ (b → ¬a) ∧ (¬a → b) 11│10 │ propext │ (b ↔ ¬a) = ((b → ¬a) ∧ (¬a → b)) 12│9,11 │ eq.rec │ ((a → ¬b) ∧ (¬b → a) ↔ (b ↔ ¬a)) = ((a → ¬b) ∧ (¬b → a) ↔ (b → ¬a) ∧ (¬a → b)) 13│12 │ id │ ((a → ¬b) ∧ (¬b → a) ↔ (b ↔ ¬a)) = ((a → ¬b) ∧ (¬b → a) ↔ (b → ¬a) ∧ (¬a → b)) 14│ │ imp_not_comm │ a → ¬b ↔ b → ¬a 15│ │ not_imp_comm │ ¬b → a ↔ ¬a → b 16│14,15│ and_congr │ (a → ¬b) ∧ (¬b → a) ↔ (b → ¬a) ∧ (¬a → b) 17│13,16│ eq.mpr │ (a → ¬b) ∧ (¬b → a) ↔ (b ↔ ¬a) 18│8,17 │ eq.mpr │ a ↔ ¬b ↔ (b ↔ ¬a)
Reid Barton (Aug 31 2018 at 06:16):
You should make a version which outputs those judgment tree things and outputs LaTeX
Patrick Massot (Aug 31 2018 at 07:28):
Noooo! We triggered Mario's immune defenses. He spent three days with people who want Lean to prove everything by itself, he merged tidy and then, flying back, he wrote the Lean2metamath tactic!
Kevin Buzzard (Aug 31 2018 at 12:36):
"On the flight home, I wrote an explode command" = "I just risked getting the plane diverted because the guy next to me panicked"
Mario Carneiro (Aug 31 2018 at 12:37):
I originally called it mmshow
but I decided against metamath branding it
Last updated: Dec 20 2023 at 11:08 UTC