Zulip Chat Archive

Stream: new members

Topic: false.elim tactic?


Alexandre Rademaker (Sep 26 2019 at 19:38):

What is the false.elim equivalent in tactic mode? I have the following proof state:

lemma anat : AP :=
begin
 apply or.elim h1,
 intro,
 have h, from h13 a,

end

with h15 h I have false. From that I should be able to proof anything.

AA AB AP : Prop,
h1 : AA ∨ AB ∨ AP,
h13 : AA → AB,
h15 : ¬AB,
a : AA,
h : AB
⊢ AP

The complete proof without tactics is:

lemma ana : AP :=
or.elim h1
 (λ h₂ : AA, show AP, from false.elim (absurd h₂ (λ h₁ : AA, show false,
  from (absurd (h13 h₁) h15))))
 (λ h₂ : AB  AP, show AP,
  from or.elim h₂
   (λ h₃ : AB, show AP, from false.elim (absurd h₃ h15))
   (λ h₃ : AP, h₃))

TPiL says nothing about in the chapter 5.

Jesse Michael Han (Sep 26 2019 at 19:40):

exfalso will change the goal to false

Marc Huisinga (Sep 26 2019 at 19:41):

the "contradiction" tactic is probably what you're looking for, and it's mentioned briefly in 5.3 ;)

Bryan Gin-ge Chen (Sep 26 2019 at 19:42):

you could also probably write something like exact (h15 h).elim

Reid Barton (Sep 26 2019 at 19:42):

or cases h15 h

Alexandre Rademaker (Sep 26 2019 at 19:46):

What a shame! I missed the. contradiction! ;-) The exact (h15 h).elim didnt' work but cases h15 h works! OK, I have to study cases, very useful.

Alexandre Rademaker (Sep 26 2019 at 19:48):

It was not clear how to deal with the result of exfalso!

Marc Huisinga (Sep 26 2019 at 19:51):

exfalso is just apply false.elim

Alexandre Rademaker (Sep 26 2019 at 19:58):

Maybe I am also missing something, but in TPiL I didn't find how to use previous lemmas during a proof of a new lemma. The include works only for variables?

Alexandre Rademaker (Sep 26 2019 at 19:59):

I promisse, last question for this week! ;-)

Patrick Massot (Sep 26 2019 at 20:09):

You can apply them, construct new terms using them.

Patrick Massot (Sep 26 2019 at 20:09):

Do you have a specific example where I could show you how to do that?

Patrick Massot (Sep 26 2019 at 20:09):

You could also open a random Lean file found on the internet and see how lemmas are used.

Patrick Massot (Sep 26 2019 at 20:10):

But it's indeed striking that explanation in TPIL are so local (as opposed to theory building) that this is maybe not explained at all.

Alexandre Rademaker (Sep 26 2019 at 20:12):

It is a simple puzzle formalized in propositional logic that I am trying to rewrite the proofs with tactics. From the previous lemma ana we can prove the second claudia:

lemma ana : AP :=
or.elim h1
 (λ h₂ : AA, show AP, from false.elim (absurd h₂ (λ h₁ : AA, show false,
  from (absurd (h13 h₁) h15))))
 (λ h₂ : AB  AP, show AP,
  from or.elim h₂
   (λ h₃ : AB, show AP, from false.elim (absurd h₃ h15))
   (λ h₃ : AP, h₃))

lemma claudia : CB :=  (h18 (ana h1 h13 h15))

Above I was able to prove ana with tactics:

include h1 h13 h15

lemma anat : AP :=
begin
 apply or.elim h1,
 intro,
 have h₁, from h13 a,
 cases (h15 h₁),
 intro, apply or.elim a,
 intro h₃, contradiction,
 intro h₄, exact h₄
end

lemma claudiat (a : AP) : CB :=
begin
 exact h18 a,
end

But I don't want to insert the hypothesis a : AP in the claudiat lemma, it could be dependent of the previous lemma. Complete code here.

Patrick Massot (Sep 26 2019 at 20:18):

You can write exact h18 anat, although there is no point writing that in tactic mode.

Patrick Massot (Sep 26 2019 at 20:18):

oh wait

Patrick Massot (Sep 26 2019 at 20:18):

anat depends on a bunch of variable assumptions, right?

Alexandre Rademaker (Sep 26 2019 at 20:20):

Yes. They are declared as parameters.

Patrick Massot (Sep 26 2019 at 20:20):

You can write

lemma claudiat : CB :=
begin
  apply h18,
  apply ana ; assumption,
end

Patrick Massot (Sep 26 2019 at 20:21):

after include h1 h13 h15 h18 of course

Patrick Massot (Sep 26 2019 at 20:22):

Those includes are not necessary in term mode, because Lean can inspect the proof term and figure out it uses those variables.

Patrick Massot (Sep 26 2019 at 20:23):

Of course you can also import mathlib's tactic, skip the anat lemma entirely and write:

lemma claudiat : CB :=
by finish

Alexandre Rademaker (Sep 26 2019 at 20:24):

Oh, thank you. I will study mathlib the the solution above. It seems more succinct than the one I obtained:

lemma claudiat1 : CB :=
begin
 exact h18 (anat h1 h13 h15),
end

Patrick Massot (Sep 26 2019 at 20:25):

The by finish solution is cheating, it's calling automation to do all the work for you.

Patrick Massot (Sep 26 2019 at 20:25):

This is clearly a problem you would expect a computer to solve.

Patrick Massot (Sep 26 2019 at 20:27):

And really there is no point at all in writing

begin
  exact stuff
end

it's exactly the same as writing stuff (hence the name of the exact tactic).

Alexandre Rademaker (Sep 26 2019 at 20:27):

Yes, but I really prefer to understand better the tactics before relying on the automation...

Alexandre Rademaker (Sep 26 2019 at 20:28):

but if I remove exact in begin exact h18 (anat h1 h13 h15), end above, I got an error.

Marc Huisinga (Sep 26 2019 at 20:29):

you need to remove begin/end as well

Alexandre Rademaker (Sep 26 2019 at 20:36):

Oh, I got your point now. Yes, in that particular case tactic mode does make sense at all. I agree, just forcing myself to learn tactics and comparing with the other approach for construct proofs.

Kevin Buzzard (Sep 26 2019 at 21:32):

[edit: saw the code link]

Kevin Buzzard (Sep 26 2019 at 21:42):

lemma ana : AP := or.elim h1 (λ h₂, false.elim $ h15 $ h13 h₂) (λ h₂, or.elim h₂ (λ h₃, false.elim $ h15 h₃) id) would be a term mode way to write it. This would be more the mathlib style I guess.

Mario Carneiro (Sep 26 2019 at 22:44):

if we're golfing term mode:

theorem ana {AA AB AP : Prop}
  (h1 : AA  AB  AP) (h13 : AA  AB) (h15 : ¬AB) : AP :=
(h1.resolve_left (mt h13 h15)).resolve_left h15

Last updated: Dec 20 2023 at 11:08 UTC