Coq 在鸽子洞原理的证明中应如何使用排除中间点? 引理移除{A}(x:A)xs(p:In x xs): 存在xs',(对于所有x',x'x->In x'xs->In x'xs')/\(长度xs=S(长度xs'))。 证明。 归纳法xs。 -倒置p。 -破坏p。 +subst x0。 存在xs。 分裂 *介绍x’neq引脚。 自毁销。 --反驳neq。对称性假设。 --假设。 *自反性。 +销毁(IHxs H)为[xs'pxs']。清除IHX。 将pxs'破坏为[p1正压送风]。将x0重命名为x'。 存在(x'::xs')。 分裂 *介绍x''neq引脚。 自毁销。 --subst x'。左边自反性。 --对。应用p1。假设。假设。 *简单。 重写->全集。 自反性。 Qed。 原理:forall(X:Type)(l1-l2:list X), 排除在外\u中间-> AllIn l1 l2-> 长度l2 重复l1。 证明。 诱导l1;单纯形;介绍l2 ex_mid Hin Hlen。 -哈伦。 -重复应用。 析构函数(删除x l2)为[l2'Hl2]。 +应用Hin。左边自反性。 +将Hl2销毁为[Hmap Hlen']。 在赫伦中重写赫伦。 清除“Hlen”。 应用(IHl1-l2')。 1:{假设} 2:{还原Hlen.展开lt.intros.omega.} 清除Hlen IHl1。 我是希恩。 展开AllIn。 介绍。 应用Hmap。 2:{适用于正确的假设。} 1子目标 X:类型 x:x l1,l2:列表X ex_mid:排除在外的_mid l2':列表X Hmap:forall x':x,x'x->In x'l2->In x'l2' Hin:forall u:X,In u(X::l1)->In u l2 u:X H:在u l1中 ______________________________________(1/1) ux

Coq 在鸽子洞原理的证明中应如何使用排除中间点? 引理移除{A}(x:A)xs(p:In x xs): 存在xs',(对于所有x',x'x->In x'xs->In x'xs')/\(长度xs=S(长度xs'))。 证明。 归纳法xs。 -倒置p。 -破坏p。 +subst x0。 存在xs。 分裂 *介绍x’neq引脚。 自毁销。 --反驳neq。对称性假设。 --假设。 *自反性。 +销毁(IHxs H)为[xs'pxs']。清除IHX。 将pxs'破坏为[p1正压送风]。将x0重命名为x'。 存在(x'::xs')。 分裂 *介绍x''neq引脚。 自毁销。 --subst x'。左边自反性。 --对。应用p1。假设。假设。 *简单。 重写->全集。 自反性。 Qed。 原理:forall(X:Type)(l1-l2:list X), 排除在外\u中间-> AllIn l1 l2-> 长度l2 重复l1。 证明。 诱导l1;单纯形;介绍l2 ex_mid Hin Hlen。 -哈伦。 -重复应用。 析构函数(删除x l2)为[l2'Hl2]。 +应用Hin。左边自反性。 +将Hl2销毁为[Hmap Hlen']。 在赫伦中重写赫伦。 清除“Hlen”。 应用(IHl1-l2')。 1:{假设} 2:{还原Hlen.展开lt.intros.omega.} 清除Hlen IHl1。 我是希恩。 展开AllIn。 介绍。 应用Hmap。 2:{适用于正确的假设。} 1子目标 X:类型 x:x l1,l2:列表X ex_mid:排除在外的_mid l2':列表X Hmap:forall x':x,x'x->In x'l2->In x'l2' Hin:forall u:X,In u(X::l1)->In u l2 u:X H:在u l1中 ______________________________________(1/1) ux,coq,Coq,我在网上找到了各种关于鸽子洞原理的解决方案。上面的内容是从一个作者那里改编而来的,但在他的证明中,他证明了不存在重复,而是像SF练习一样存在重复 明显的区别是,我无法证明这里的ux目标,因为在这个表格中说明问题时,信息较少 既然这个问题既难又可选择,而且有现成的解决方案——我已经研究了两天了,有人能给我描述一个高层次的计划,确切地说,我需要什么来证明这一点 我不是在寻找一个解决方案,但我希望中间被排除在外的那个会变得优雅,因为Coq证明只是一个重写的烂摊子,了解程序的源代码远远不能理解它的功能。

我在网上找到了各种关于鸽子洞原理的解决方案。上面的内容是从一个作者那里改编而来的,但在他的证明中,他证明了不存在重复,而是像SF练习一样存在重复

明显的区别是,我无法证明这里的
ux
目标,因为在这个表格中说明问题时,信息较少

既然这个问题既难又可选择,而且有现成的解决方案——我已经研究了两天了,有人能给我描述一个高层次的计划,确切地说,我需要什么来证明这一点

我不是在寻找一个解决方案,但我希望中间被排除在外的那个会变得优雅,因为Coq证明只是一个重写的烂摊子,了解程序的源代码远远不能理解它的功能。大多数关于这个原理的解释仅仅描述了它是什么,这还不足以弥补直觉的鸿沟


我从来没有见过经典定律在起作用——似乎知道某些东西是可判定的并不会给我带来很多好处,我发现很难理解它们的意义。在这种情况下尤其如此,因此我更感兴趣的是看看他们的目的是什么。

我在通过SF(软件基金会)寻找答案时遇到了这个问题,但我自己设法证明了这一点。我将提供一个SF版本的鸽子洞原理的草图,使用排除的_middle。要证明的陈述是,如果列表
l1
中的所有元素都在
l2
中并且
length l2
小于
length l1
,则
l1
包含重复的元素

SF建议的证明从
l1
的归纳开始。我将省略这个简单的空箱子。在感应情况下,销毁
l2
l2
为空的情况很简单;我们考虑另一种情况。

现在,由于对
l1
的归纳和对
l2
的解构,您要证明的语句是关于具有第一个成员的列表,让我们称它们为
x1::l1
x2::l2
。您的成员资格假设现在看起来是这样的:
x1::l1
中的所有元素都在
x2::l2

但首先,让我们使用排除中间值来表示
x1
l1
中,或者
x1
不在
l1
中。如果
x1
l1
中,那么我们可以证明
x1::l1
有重复。所以向前看,我们可以假设
x1
不在
l1

它足以匹配感应情况,即存在与
l2
长度相同的
l2'
,使得
l1
的所有元素都在
l2'

现在考虑“<代码> x1::L1 < /代码>的成员假设,将所有变量引入<代码> x<代码>:

通过假设,我们知道
x1
x2::l2
中。现在考虑<代码> L2′/代码>,其中代码> L2′/代码>是代码> x2::L2< /代码>一个实例<代码> x1< /代码>被删除(使用<代码> In Spult)。现在,由于
x1
不在
l1
中,我们可以得出结论,
l1
的所有成员也在
l2'
中,而不是删除的元素。然后这满足了归纳中的成员假设,一些关于长度的争论给了我们
length l2=length l2'
,因此长度假设得到了满足。因此,我们得出结论,
l1
包含重复,因此也包含
x1::l1


编辑:之前,我还对
x1
=
x2
x1
l2
中,以及
x
=
x2
x
l2
中,进行了案例分析,并以更直观的方式解决了特殊情况。它是不需要的,一般情况下也包括它们。

IIRC您不需要EM。Cf.对于使用
repeats
的类似公式,确实不需要它,但使用它时定义要简单得多。我不会检查您的解决方案在形式上是否正确,而是相信您的话。5.5个月前,当我问这个问题时,不知何故,鸽子洞的证据产生了completel的效果
Lemma remove {A} (x : A) xs (p : In x xs) :
  exists xs', (forall x', x' <> x -> In x' xs -> In x' xs') /\ (length xs = S (length xs')).
Proof.
induction xs.
- inversion p.
- destruct p.
  + subst x0.
    exists xs.
    split.
    * intros x' neq pin.
      destruct pin.
      -- contradict neq. symmetry. assumption.
      -- assumption.
    * reflexivity.
  + destruct (IHxs H) as [xs' pxs']. clear IHxs.
    destruct pxs' as [p1 plen]. rename x0 into x'.
    exists (x' :: xs').
    split.
    * intros x'' neq pin. 
      destruct pin.
      -- subst x'. left. reflexivity.
      -- right. apply p1. assumption. assumption.
    * simpl.
      rewrite -> plen.
      reflexivity. 
Qed.

Theorem pigeonhole_principle: forall (X:Type) (l1  l2:list X),
  excluded_middle ->
  AllIn l1 l2 ->
  length l2 < length l1 ->
  repeats l1.
Proof.
induction l1; simpl; intros l2 ex_mid Hin Hlen.
- inversion Hlen.
- apply repeats_rest.
  destruct (remove x l2) as [l2' Hl2].
  + apply Hin. left. reflexivity.
  + destruct Hl2 as [Hmap Hlen'].
    rewrite Hlen' in Hlen.
    clear Hlen'.
    apply (IHl1 l2').
    1 : { assumption. }
    2 : { revert Hlen. unfold lt. intros. omega. }
    clear Hlen IHl1.
    revert Hin.
    unfold AllIn.
    intros.
    apply Hmap.
    2 : { apply Hin. right. assumption. }
1 subgoal
X : Type
x : X
l1, l2 : list X
ex_mid : excluded_middle
l2' : list X
Hmap : forall x' : X, x' <> x -> In x' l2 -> In x' l2'
Hin : forall u : X, In u (x :: l1) -> In u l2
u : X
H : In u l1
______________________________________(1/1)
u <> x