[英]Coq true = false discriminate fails, no primitive equality
我试图证明以下内容,并且我想通过列举b
所有情况和所有单参数布尔函数f
(应该是2个布尔值中的4个函数)来解决问题的正确方法,并通过详尽地证明了这一点破坏一切。
Theorem example :
forall (f : bool -> bool) (b : bool),
f (f b) = b.
Proof.
intros.
destruct (f (f b)).
- destruct b.
+ reflexivity.
+ Fail discriminate. admit.
- destruct b eqn:Hqebb.
+ Fail discriminate. admit.
+ reflexivity.
Qed.
但是,当我尝试区分第二步和第三步时,在false = true
出现以下错误:
Ltac call to "discriminate" failed.
No primitive equality found.
我以前使用过归纳类型来区分,它按预期方式工作,所以令我惊讶的是,它在布尔类型中不起作用。 有什么想法吗?
如果您有一个假设true = false
(这是不可能的),则可以使用discriminate
来完成目标。 在您坚持的目标中,要求您证明 true = false
。 没有战术可以做到这一点,这是不可能完成的任务!
您使用的特定示例定理实际上是错误的:
Theorem not_example:
~ forall (f : bool -> bool) (b : bool), f (f b) = b.
Proof.
intros H.
specialize (H (fun _ => true) false).
simpl in H.
discriminate.
Qed.
但是总的来说,正如亚瑟(Arthur)所说,做到这一点的方法是使用eqn:选项来destruct
,以记住相关的方程式。 例如,这里是一个证明脚本,主要用于证明您的定理,但错误的情况除外:
Theorem example :
forall (f : bool -> bool) (b : bool),
f (f b) = b.
Proof.
intros.
destruct (f true) eqn:?; destruct (f false) eqn:?; destruct b; try congruence.
仅当您的上下文具有与其他构造函数开头的归纳类型术语相等的假设时, discriminate
策略才有效。 当您执行第一个调用discriminate
,上下文如下所示:
f : bool -> bool
============================
true = false
如您所见,上下文不包含任何相等性假设,因此discriminate
不能做任何事情。 要解决此问题,您需要对destruct
策略使用eqn:
选项,以便Coq在上下文中记录所有相关事实。 例如,如果您致电
destruct b eqn:H.
并且b
为bool
类型,则Coq除了照常生成两个子目标之外,还将添加假设H : b = true
和H : b = false
。
(感谢您更改了问题,但我只是想指出,您现在提出的定理是不可证明的。将其应用于您的原始问题应该不会太困难。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.