isabelle - 一对空的“证明 qed”在 Isabelle 中是如何工作的?
问题描述
在 Isabelle 2020 文档 classes.pdf pp.10 中,有一个看起来很奇怪的证明序列:(proof qed auto
为了说明目的分为三行),这真的让我感到困惑:
interpretation list_monoid: monoid append "[]"
proof
qed
auto
所以证明似乎是空的(在proof
和之间qed
),然后是一个auto
。如果将鼠标放在证明位置,则显示三个目标:
goal (3 subgoals):
1. ⋀x y z. (x @ y) @ z = x @ y @ z
2. ⋀x. [] @ x = x
3. ⋀x. x @ [] = x
在 处qed
,目标消失。然后,auto
似乎什么都不做。
有人可以帮助解释proof qed ...
结构是如何工作的吗?
就 Izar 与应用样式模式而言,在每一行proof, qed
和auto
行中,系统处于哪种模式?
解决方案
范式的解释qed m
可以在官方文档(Isar-ref)的 6.4.2 小节中找到:
proof
:证明(证明)-> 证明(状态)
qed
:证明(状态) -> 证明(状态) | 本地理论 | 理论
- 初始细化步骤
proof m1
将新陈述的目标减少为稍后要解决的许多子目标。m1
如果由证明(链)模式指示,则将事实传递给 前向链接。
- 最终结论步骤
qed m2
旨在解决剩余的目标。没有事实传递给m2
.
如果继续阅读,还有更详细的解释:
proof m1
用证明方法细化目标m1
;如果证明(链)模式指示,则通过前向链接的事实。
qed m2
通过证明方法细化任何剩余的目标,m2
并通过假设得出子证明。如果目标是show
,则某些未决子目标也将通过导出到封闭目标上下文的结果产生的规则来解决。因此qed
可能会因两个原因而失败:要么m2
失败,要么结果规则不适合封闭上下文的任何未决目标。
qed
因此,在尝试解决剩下的目标时传递一个方法是完全合法的。在上面的示例中,有效地,在应用调用的默认细化步骤后剩余的所有目标proof
都由 解决auto
。
by m1 m2
通常可以用来代替proof m1 qed m2
(唯一的区别是by m1 m2
回溯m1
和m2
)。因此,我相信证明原始问题中的定理的另一种常规方法是
interpretation list_monoid: monoid append "[]"
by unfold_locales auto
有关描述,by
另请参见 Isar-ref 中的第 6.4.2 小节。
证明定理的一种稍微不那么传统的方法,但更接近proof qed auto
原始问题中的范式是
interpretation list_monoid: monoid append "[]"
apply standard
apply auto
done
最后,当然,您不需要使用qed m
范式解决所有目标。下面的代码清单展示了该范例的最标准用例:
interpretation list_monoid: monoid append "[]"
proof
show
"(x @ y) @ z = x @ y @ z"
"[] @ x = x"
for x y z :: "'a list"
by auto
qed auto
答案是基于 Isabelle2021-RC2 编写的。
推荐阅读
- material-ui - 在materialui中,为了设置边距,有没有办法同时使用theme.spacing和auto?
- vue.js - Vue vuetify Dialog如何在不点击的情况下触发对话框组件
- node.js - 连接 ECONNREFUSED,阿波罗联盟
- authentication - Microsoft Teams 错误:错误代码 - caa70007
- angular - Apollo-Angular 查询返回奇怪的行为
- python - python中序数/名义列联表的Cochran-Armitage检验
- linux - 在 Whoer.net/check2ip 上未正确显示 Linux 系统时间
- r - 数据返回 is.null() 为 False 即使我的数据中有 NA?
- sql - 雪花:将一小时内存在的行数计算为单行
- android - 执行后台任务的更好方法是什么?