coq - 如何简化 Coq 中 True -> P 形式的假设?
问题描述
如果我的证明上下文中有一个看起来像的假设H: True -> P
并且我想将其转换为H: P
,那么最简单的方法是什么?我试过simpl in H
但它什么也没做,我发现的唯一方法是非常不满意pose proof (H Coq.Init.Logic.I) as H
。没有更简单的方法吗?
解决方案
除了使用pose proof
.
使用specialize
.
这种策略允许你为你的假设提供论据。在你的情况下你可以做
specialize (H I).
甚至
specialize H with (1 := I).
as
如果要创建副本而不是直接实例化,则可以使用H
。
使用forward
.
我想这就是你想要的。forward H.
将要求您证明 的第一个假设H
。所以你会做这样的事情:
forward H.
- auto.
- (* Then resume with H : P *)
但您也可以为其提供(目标关闭)策略:
forward H by auto.
(* Now you have one goal, and H has type P *)
forward
是 - 到目前为止 - 不是标准库的一部分。然而,它可以很容易地定义(这里是来自 MetaCoq 库的定义)。
Ltac forward_gen H tac :=
match type of H with
| ?X -> _ => let H' := fresh in assert (H':X) ; [tac|specialize (H H'); clear H']
end.
Tactic Notation "forward" constr(H) := forward_gen H ltac:(idtac).
Tactic Notation "forward" constr(H) "by" tactic(tac) := forward_gen H tac.
请注意,simpl
这里不起作用,因为它并不是通常意义上的简化假设的策略,它实际上只是应用一些计算规则的策略,它基本上评估目标或应用它的假设。True -> P
不会减少到,P
因为它会少一个参数。
推荐阅读
- android - 应用程序分发到 Crashlytics Beta 不适用于我的应用程序的发布版本
- python - python进程发送文件描述符
- ios - 如何在 fastlane 中获取测试结果和代码覆盖统计信息以通知其他地方?
- java - 以降序打印文件内容java
- python-3.x - 将变量写入文件
- jaxb - JAXB 生成类中的“private final static long serialVersionUID”
- javascript - 如何将 php 与 html 和 Javascript 一起使用?
- c# - EF FirstOrDefaultAsync 是真正的异步还是 Task.Run 包装器?
- vb.net - 将带有附件列的数据库访问到 VB.NET Datagridview
- python - 如何遍历一个列表直到它到达最后一个元素,然后向后遍历它直到它到达第一个元素,然后重复?