isabelle - 有没有办法命名和引用 Isabelle apply-scripts 中的假设?
问题描述
Isabelle (2021) 中是否有任何方法可以引用旧应用样式证明中的假设?
特别是,我有兴趣将假设用作OF
运算符中的事实,以便我可以(假设地)做:
apply(rule R[OF assm1 assm4])
, where assm1
andassm4
应该指当前证明状态下的第 1 和第 4 假设。
很多时候,我可以安排当前子目标的假设,使其R[OF assm1 assm4]
与子目标相同。但是,我无法完成证明,因为我不知道如何引用assm1 assm4
等。似乎只允许使用全局定理名称OF
。
我什至尝试subgoal_tac
在假设上使用该方法,但它似乎没有为事实命名的选项。
最后,我必须使用自动脚本,例如simp
,对于如此明显的事情,这有点不透明。顺便说一句,这是为了学习目的。我尝试设置simp_trace
,但仍然无法在不使用的情况下复制效果simp
。
而且,
如果没有办法参考假设,这是策略的限制还是自然演绎的根本限制?(即是R[OF assm1 assm4]
不是与自然演绎不兼容的改写方式?)
解决方案
重点是 Isar 是你可以命名假设......
第一个低级解决方案是使用drule
(或frule
保持假设)。
这是一个例子:
lemma
assumes ‹⋀x y. P x ⟹ Q y ⟹ R z› ‹P x› ‹Q y›
shows ‹R z›
using assms(2-) apply -
apply (drule assms(1))
apply assumption
apply assumption
done
有关销毁/消除/介绍规则的详细信息,请参阅第5 章。
第二种解决方案是subgoal
:
lemma
assumes ‹⋀x y. P x ⟹ Q y ⟹ R z› ‹P x› ‹Q y›
shows ‹R z›
using assms(2-) apply -
subgoal premises p
by (rule assms(1)[OF p])
done
但是如果你有非常深的嵌套,这会产生难以阅读的校样。
第三个也是最好的解决方案是使用 Isar 证明……</p>
这是一个完全避免使用名称的版本:
lemma
assumes ‹⋀x y. P x ⟹ Q y ⟹ R z› ‹P x› ‹Q y›
shows ‹R z›
using assms apply -
apply (elim meta_allE[of _ x])
apply (elim meta_allE[of _ y])
apply (drule cut_rl)
apply assumption
apply (drule cut_rl)
apply assumption
apply assumption
done
你可以看到这是多么丑陋,以及为什么你应该避免这种情况。
推荐阅读
- javascript - 来自多方的数据
- python - 井字游戏嵌套列表问题
- ios - 当应用程序未处于运行状态(非活动状态)时,下载所有推送通知
- apache-kafka - 使用 read-your-writes 摄取 Druid Kafka
- asp.net - 我可以在页面加载时加载字典并在其他地方使用它吗?
- swift - 使用 Firestore,保存和检索大量日期的最佳方式是什么?
- postgresql - JSONB 列列表上 WHERE 子句中的字符串项
- angular - 引导开关的调用事件改变
- python - C++ 正则表达式 * 只保存最后匹配的
- javascript - 使用正则表达式比较 switch 语句中的数组元素