isabelle - 证明伊莎贝尔存在无限路径
问题描述
考虑以下归纳谓词:
inductive terminating where
"(⋀ s'. s → s' ⟹ terminating s') ⟹ terminating s"
我想证明,如果节点 s 没有终止,则存在形式为 s0 → s1 → s2 → ...的无限链。
lemma "¬ terminating (c,s) ⟹
∃ cfs. (cfs 0 = (c,s) ∧ (∀ n. (cfs n) → (cfs (n+1))))"
我如何在 Isabelle 中证明这一点?
编辑
最终目标是证明以下目标:
lemma "(∀s t. (c, s) ⇒ t = (c', s) ⇒ t) ⟹
terminating (c, s) = terminating (c', s) "
其中 ⇒ 是 GCL 的大步语义。也许需要另一种方法来证明这个定理。
解决方案
如果您习惯使用选择运算符,则可以使用 轻松构建见证SOME
,例如:
primrec infinite_trace :: ‹'s ⇒ nat ⇒ 's› where
‹infinite_trace c0 0 = c0›
| ‹infinite_trace c0 (Suc n) =
(SOME c. infinite_trace c0 n → c ∧ ¬ terminating c)›
(我不确定你s
和(c,s)
价值观的类型——所以我只是用's
了那个。)
显然,如果在某些时候SOME
无法选择满足约束的值,见证构造将失败。因此,仍然必须证明非终止确实传播(从定义中很明显):
lemma terminating_suc:
assumes ‹¬ terminating c›
obtains c' where ‹c → c'› ‹¬ terminating c'›
using assms terminating.intros by blast
lemma nontermination_implies_infinite_trace:
assumes ‹¬ terminating c0›
shows ‹¬ terminating (infinite_trace c0 n)
∧ infinite_trace c0 n → infinite_trace c0 (Suc n)›
by (induct n,
(simp, metis (mono_tags, lifting) terminating_suc assms exE_some)+)
使用作为证人来证明你的存在量化infinite_trace (c,s)
是直截了当的。
推荐阅读
- emacs - Emacs 中有没有办法填充包含一些只读字符的段落?
- javascript - Ionic 2 karma-jasmine 单元测试
- python - 更改 python 二维数组中的值
- docker - 如何在 gitlab ci docker executor 中运行脚本?
- sql - 如何在 plsql-oracle 12c 中访问 json 数组元素
- laravel-5 - 在 Laravel 5.8 中验证输入
- kotlin - 了解“by”如何作为代表工作
- javascript - 致命:无法从远程存储库 npm install 读取
- javascript - 无法在时隙之间拖动事件
- python - 在本地运行 python 脚本与在 docker 中运行的区别