精益定理证明的4.4节显示如下:
example : (∀ x, p x) ↔ ¬ (∃ x, ¬ p x) := sorry
在这里,我将重点介绍从右到左的情况:
¬ (∃ x, ¬ p x) → (∀ x, p x)
我们知道我们将有一个¬ (∃ x, ¬ p x)
类型的参数,所以让我们开始:
example : ¬ (∃ x, ¬ p x) → (∀ x, p x) :=
(assume hnExnpx : ¬ (∃ x, ¬ p x),
_)
我们知道我们将必须返回类型为(∀ x, p x)
的表达式,所以让我们开始构造它:
example : ¬ (∃ x, ¬ p x) → (∀ x, p x) :=
(assume hnExnpx : ¬ (∃ x, ¬ p x),
(λ x, _))
在这一点上,我们需要返回一个p x
类型的值,目前尚不清楚我们是否可以构建一个值。也许我们需要尝试提出一个false
值。
给定hnExnpx
的情况下,函数false
返回(∃ x, ¬ p x)
。因此,让我们尝试构建其中之一,对其应用hnExnpx
,然后使用false.elim
:
example : ¬ (∃ x, ¬ p x) → (∀ x, p x) :=
(assume hnExnpx : ¬ (∃ x, ¬ p x),
(λ x,
false.elim (hnExnpx (exists.intro x (λ hpx, _)))
))
现在,我们回到了另一个false
值。
第3章提到有时需要经典逻辑。
使用(em (∀ x, p x))
的幼稚方法将我们引到这里:
example : ¬ (∃ x, ¬ p x) → (∀ x, p x) :=
(assume hnExnpx : ¬ (∃ x, ¬ p x),
or.elim (em (∀ x, p x))
(λ hAxpx, hAxpx)
(λ hnAxpx : ¬ (∀ x, p x), (λ x, _))
)
同样,我们需要一个p x
值或一个false
。我们唯一的新事物是hnAxpx : ¬∀ (x : α), p x
。尚不清楚如何获得p x
。 hnAxpx
确实返回false,但是我们需要一个(∀ x, p x)
,这是我们想要的原始内容。 :-)
也许这涉及对经典逻辑的更精细的使用?
欢迎提出任何建议!
更新
以下是基于simon1505475的评论的一种方法,该方法似乎有效:
示例:¬(∃x,¬p x)→(∀x,p x):=
(assume hnExnpx : ¬ (∃ x, ¬ p x),
(λ x,
or.elim (em (p x))
(λ hpx : p x, hpx)
(λ hnpx : ¬ p x,
false.elim (hnExnpx (exists.intro x (λ hpx : p x, hnpx hpx))))))