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
我在网上找到了各种关于鸽子洞原理的解决方案。上面的内容是从一个作者那里改编而来的,但在他的证明中,他证明了不存在重复,而是像SF练习一样存在重复 明显的区别是,我无法证明这里的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证明只是一个重写的烂摊子,了解程序的源代码远远不能理解它的功能。
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