Zulip Chat Archive

Stream: new members

Topic: negated forall


Patrick Thomas (Sep 19 2020 at 18:30):

I can't seem to figure out how to deal with the negated forall to prove the sorry in the following. I feel like I'm missing something obvious, but I don't know what.

theorem thm1 (α : Type) (P : α  Prop) : (¬  x : α, P x)  ( x : α, ¬ P x) :=
iff.intro
(
  show (¬  x : α, P x)  ( x : α, ¬ P x), from sorry
)
(
  show ( x : α, ¬ P x)  (¬  x : α, P x), from
  assume a1 :  x : α, ¬ P x,
  exists.elim a1 (
    assume x' : α,
    assume a2 : ¬ P x',
    assume a3 :  x : α, P x,
    have s1 : P x' := a3 x',
    show false, from a2 s1
  )
)

Kenny Lau (Sep 19 2020 at 18:31):

it's a classical theorem, that's why you can't prove it using just the usual operations

Kenny Lau (Sep 19 2020 at 18:31):

you need classical.em

Kenny Lau (Sep 19 2020 at 18:31):

as a "source of extra knowledge"

Patrick Thomas (Sep 19 2020 at 18:32):

Huh.

Patrick Thomas (Sep 19 2020 at 18:32):

Ok. But the direction I did prove does not?

Kenny Lau (Sep 19 2020 at 18:33):

yep, as you demonstrated

Patrick Thomas (Sep 19 2020 at 18:34):

Interesting.

Kevin Buzzard (Sep 19 2020 at 18:36):

import tactic

theorem thm1 (α : Type) (P : α  Prop) : (¬  x : α, P x)  ( x : α, ¬ P x) :=
by simp

Kevin Buzzard (Sep 19 2020 at 18:36):

And then you can use squeeze_simp to find out what the lemma it used is called

Kevin Buzzard (Sep 19 2020 at 18:37):

and then you can #check that lemma and see what assumptions it uses

Kevin Buzzard (Sep 19 2020 at 18:37):

and maybe you'd find some decidability nonsense, although after the recent refactor I am now less sure of this

Kevin Buzzard (Sep 19 2020 at 18:39):

Indeed I just tried it and the clues that it is classical are now more well-hidden.

Kevin Buzzard (Sep 19 2020 at 18:39):

#print axioms not_forall

Patrick Thomas (Sep 19 2020 at 18:44):

I would be interested in seeing what it looks like without tactics. I should be able to prove it from not P or P?

Kevin Buzzard (Sep 19 2020 at 18:46):

You can prove it from forall P, P or not P, yes.

Patrick Thomas (Sep 19 2020 at 18:47):

Ok. I'll give it a try. Thank you.

Johan Commelin (Sep 19 2020 at 18:47):

Patrick Thomas said:

I would be interested in seeing what it looks like without tactics.

You can see what the tactics did by writing #print my_lemma_name. I don't promise that it will look nice.

Patrick Thomas (Sep 19 2020 at 18:48):

Yeah, I want it to look nice :)

Kevin Buzzard (Sep 19 2020 at 18:50):

In practice in tactic mode, by_contra is much more useful than EM. So I would first establish not not P implies P and then apply rhat function when things are getting sticky. It banks you a "not P" hypothesis which you can apply the next time you play this trick.

Johan Commelin (Sep 19 2020 at 18:50):

You might still glean some useful theorem names from the output

Patrick Thomas (Sep 24 2020 at 17:03):

I think I got it?

open classical


lemma not_not {P : Prop} : ¬ ¬ P  P :=
assume a1 :  ¬ ¬ P,
by_contradiction (
  assume a2 : ¬ P,
  show false, from a1 a2
)


example {α : Type} {P : α  Prop} : ( x : α, ¬ P x)  ¬ ( x : α, P x) :=
assume a1 :  x : α, ¬ P x,
exists.elim a1 (
  assume x' : α,
  assume a2 : ¬ P x',
  assume a3 :  x : α, P x,
  have s1 : P x' := a3 x',
  show false, from a2 s1
)


example {α : Type} {P : α  Prop} : ¬ ( x : α, ¬ P x)  ( x : α, P x) :=
assume a1 : ¬ ( x : α, ¬ P x),
assume x' : α,
by_contradiction (
  assume a2 : ¬ P x',
  have s1 :  x : α, ¬ P x := exists.intro x' a2,
  show false, from a1 s1
)


example {α : Type} {P : α  Prop} : ( x : α, P x)  ¬ ( x : α, ¬ P x) :=
assume a1 :  x : α, P x,
exists.elim a1 (
  assume x' : α,
  assume a2 : P x',
  assume a3 :  x : α, ¬ P x,
  have s1 : ¬ P x' := a3 x',
  show false, from s1 a2
)


example {α : Type} {P : α  Prop} : ¬ ( x : α, P x)  ( x : α, ¬ P x) :=
assume a1 : ¬ ( x : α, P x),
assume x' : α,
by_contradiction (
  assume a2 : ¬ ¬ P x',
  have s1 : P x' := not_not a2,
  have s2 :  x : α, P x := exists.intro x' s1,
  show false, from a1 s2
)

If I import tactic I seem to get an issue with by_contradiction also being a tactic. Is there a way around that?


Last updated: Dec 20 2023 at 11:08 UTC