我将描述引导我找到解决方案的思维过程,以防有帮助。我们可以应用归纳法,很容易简化到案例l1 = a::l1'
, l2 = a::l2'
. Now l1'
是一个子集a::l2'
。我受过 EM 训练的直觉是以下之一成立:
在后一种情况下,每个元素l1'
is in a::l2'
但不同于a
,因此必须在l2'
. Thus l1'
是一个子集l2'
,我们可以应用归纳假设。
不幸的是如果In
是不可判定的,以上不能直接形式化。特别是,如果给定类型的相等性不可判定,则很难证明元素不相等,因此很难证明像这样的否定陈述~(In a l1')
。然而,我们想用这个否定的陈述来证明一个积极的陈述,即
forall x, In x l1' -> In x l2'
以此类推,假设我们想证明
P \/ Q
Q -> R
------
P \/ R
上面直观的论证就像是从P \/ ~P
,并使用~P -> Q -> R
在第二种情况下。我们可以使用直接证明来避免 EM。
对列表进行量化l1'
使这有点复杂,但我们仍然可以使用以下引理构建直接证明,这可以通过归纳法来证明。
Lemma split_or {X} (l : list X) (P Q : X -> Prop) :
(forall x, In x l -> (P x \/ Q x)) ->
(exists x, In x l /\ P x) \/ (forall x, In x l -> Q x).
最后注意,直觉鸽巢原理也可以形式化为以下方式,当类型具有不可判定的相等性时无法证明(注意它的结论中有否定陈述):
Definition pigeon2 {X} : Prop := forall (l1 l2 : list X),
length l2 < length l1 ->
(exists x, In x l1 /\ ~(In x l2)) \/ repeats l1.