繁体   English   中英

Coq true = false区分失败,没有原始相等性

[英]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.

并且bbool类型,则Coq除了照常生成两个子目标之外,还将添加假设H : b = trueH : b = false

(感谢您更改了问题,但我只是想指出,您现在提出的定理是不可证明的。将其应用于您的原始问题应该不会太困难。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM