我对可能是错误的引理感兴趣:
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_introl
或or_intror
开头,那么我们就完成了。所以我想问题是当该术语是lambda应用程序时。但是后来Coq术语被高度归一化,因此我们将其简化为正常形式,似乎它将以or_introl
或or_intror
开头。
第二个问题:如果这个问题可以在Coq之外确定,是什么阻止我们将其内化到Coq中,即证明上面的引理decideOr
?
答案 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 \/ B
或true
。确实,如果您写
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
的证明”)之间是有区别的。