如何从 LEAN 中的第一原理证明 (¬∀x, p x) → (∃ x, ¬ p x)?
How can one prove (¬ ∀ x, p x) → (∃ x, ¬ p x) from first principles in LEAN?
"Theorem proving in Lean" 4.4 中的练习从第一原理证明了这一基本含义,击败了我迄今为止的所有尝试:
open classical
variables (α : Type) (p q : α → Prop)
variable a : α
local attribute [instance] classical.prop_decidable
theorem T08R : (¬ ∀ x, p x) → (∃ x, ¬ p x) :=
begin
intro nAxpx,
--by_contradiction nExnpx,
--apply nAxpx,
end
intro
之后我不知道如何使用nAxpx
更进一步。我想到了by_contradiction
,但是那只是引入了否定的存在nExnpx
,它不能和cases
一起使用,所以我无法产生x : α
。排除中间似乎也没有帮助。我可以用mathlib
战术得到证明,
theorem T08R : (¬ ∀ x, p x) → (∃ x, ¬ p x) :=
begin
push_neg,
tauto
end
但是没有足够的知识将其转换回战术模式,所以这对我的理解没有帮助。
我想你必须 by_contradiction
两次。在 apply naXpx
之后尝试 intro a
然后 by_contradiction
。然后你将得到 a
¬p a
的证明,还有 ¬∃ (x : α), ¬p x
矛盾的证明。
完整的证明是
theorem T08R : (¬ ∀ x, p x) → (∃ x, ¬ p x) :=
begin
intro nAxpx,
by_contradiction nExnpx,
apply nAxpx,
assume a,
by_contradiction hnpa,
apply nExnpx,
existsi a,
exact hnpa,
end
"Theorem proving in Lean" 4.4 中的练习从第一原理证明了这一基本含义,击败了我迄今为止的所有尝试:
open classical
variables (α : Type) (p q : α → Prop)
variable a : α
local attribute [instance] classical.prop_decidable
theorem T08R : (¬ ∀ x, p x) → (∃ x, ¬ p x) :=
begin
intro nAxpx,
--by_contradiction nExnpx,
--apply nAxpx,
end
intro
之后我不知道如何使用nAxpx
更进一步。我想到了by_contradiction
,但是那只是引入了否定的存在nExnpx
,它不能和cases
一起使用,所以我无法产生x : α
。排除中间似乎也没有帮助。我可以用mathlib
战术得到证明,
theorem T08R : (¬ ∀ x, p x) → (∃ x, ¬ p x) :=
begin
push_neg,
tauto
end
但是没有足够的知识将其转换回战术模式,所以这对我的理解没有帮助。
我想你必须 by_contradiction
两次。在 apply naXpx
之后尝试 intro a
然后 by_contradiction
。然后你将得到 a
¬p a
的证明,还有 ¬∃ (x : α), ¬p x
矛盾的证明。
完整的证明是
theorem T08R : (¬ ∀ x, p x) → (∃ x, ¬ p x) :=
begin
intro nAxpx,
by_contradiction nExnpx,
apply nAxpx,
assume a,
by_contradiction hnpa,
apply nExnpx,
existsi a,
exact hnpa,
end