确定排序Prop

时间:2019-05-02 12:40:35

标签: coq

我对可能是错误的引理感兴趣:

Lemma decideOr : forall (P Q : Prop),
    (P \/ Q) -> {P} + {Q}.

断言我们可以通过算法确定or形式的Prop的任何证明。当然,Coq不允许我们destruct输入以Set的形式提取它。但是,P \/ Q的证明是Coq接受打印的lambda术语,因此外部工具可以对其进行处理。

第一个问题:可以在Coq之外确定该Lambda项(假设该术语不使用任何公理,仅使用普通Coq)?可能是因为构造逻辑的规则要求所有析取词都被明确选择,而不能被矛盾的证明所欺骗。因此,我们可以对Coq证明词的解析器进行编码,然后尝试确定or的第一个或第二个操作数是否得到证明吗?如果术语以or_introlor_intror开头,那么我们就完成了。所以我想问题是当该术语是lambda应用程序时。但是后来Coq术语被高度归一化,因此我们将其简化为正常形式,似乎它将以or_introlor_intror开头。

第二个问题:如果这个问题可以在Coq之外确定,是什么阻止我们将其内化到Coq中,即证明上面的引理decideOr

1 个答案:

答案 0 :(得分:1)

第一个问题

是的,您可以编写一个程序,将 final ActivateSpeedAlert job = new ActivateSpeedAlert(); List definitions = job.getActivateSpeedAlertType().getSpeedAlertDefinition(); int size= 10; when(definitions.size() > 1).toString(); mValetAlert.sendSpeedAlertJobAcknowledgement(monitorings.speedalert.ErrorCodes.OTHER_ERROR, job.getId()); verify(mMessengerMock).publish(eq(Channel.CLOUD_CHANNEL), eq(PubSubId.ValetAlert.SPEED_ALERT_ERROR), any(), any(Bundle.class)); 的Coq证明作为输入,并根据用来证明分离的那一侧输出A \/ Btrue。确实,如果您写

false

在Coq中,Compute P. ,Coq将对证明P : A \/ B进行规范化并打印使用了哪个构造函数。如果P使用以P结尾的证明,这将不起作用(因为评估者未展开证明),但是原则上可以用Qed代替Qed到处都可以使用。

第二个问题

阻止我们证明Defined的原因是Coq的设计者希望有一种命题,该命题在支持程序执行的同时(使用公理)支持排除的中间。如果decideOr是一个定理并且,我们想使用排除的中间数(decideOr),则不可能执行基于{{1} }。这并不意味着classical : forall A : Prop, A \/ ~ A是错误的:完全有可能将其视为公理。无法证明(“不存在decideOr (classical A)的证明”)与可以辩驳(“存在decideOr的证明”)之间是有区别的。