isabelle - 在这个例子中证明 Isabelle/HOL 的存在
问题描述
我正在尝试学习如何将 Isabelle/Isar 与 HOL 一起使用,我决定一个好的方法是开发一些基本数论。我定义了自己的 plus 和 times 操作,这样证明方法就不会为我完成所有工作,因为在 Main 中已经有很多关于 +, * 的证明。我的版本定义为:
fun p:: "nat ⇒ nat ⇒ nat" (infix "⊕" 80) where
p_0: "0 ⊕ n =n" |
p_rec: " (Suc m) ⊕ n = Suc (m ⊕ n)"
fun t:: "nat ⇒ nat ⇒ nat" (infix "⊗" 90) where
t_0: "0 ⊗ n= 0" |
t_rec: "Suc m ⊗ n = n + m ⊗ n"
我已经证明了乘法和加法在分配律中是可交换的。然后我尝试显示以下内容:
lemma euclidean_division_existence: "∃q r. n=q⊗m⊕r"
proof (induction n)
case 0
have "0= 0 ⊗ m" by auto
hence "∃q. 0 =q ⊗ m" by auto
但它告诉我它无法完成最后一步的证明。我尝试了各种方法,但我不知道如何告诉伊莎贝尔,我只是为我要证明的存在陈述作证。我怎样才能让伊莎贝尔认识到这一点?
编辑:
xanonec 帮助我完成了这一步,但我立即被一个看似相似的问题困在了下一步。最终我想展示:
"∃ q r. 0 = q ⊗ m⊕r"
但我不知道如何同时引入两个存在量化变量
"0 = 0 ⊗ m ⊕ 0"
解决方案
解决方案的合适策略可能是直接规则应用程序(在 jEdit 中,您可以cntrl
+LMB 或cmd
+LMB onexI
导航到其语句):
lemma euclidean_division_existence: "∃q r. n=q⊗m⊕r"
proof(induction n)
case 0
have "0 = 0 ⊗ m" by auto
hence "∃q. 0 = q ⊗ m" by (rule exI)
qed
更一般地说,在许多类似的情况下sledgehammer
可以找到合适的(但通常是次优的)证明。使用教程sledgehammer
是 Isabelle 官方文档的一部分。另外,我想推荐以下资源: Tobias Nipkow 和 Gerwin Klein 的“Concrete Semantics with Isabelle/HOL”和 Tobias Nipkow 等人的“A Proof Assistant for Higher-Order Logic”。
对问题陈述进行修改后的更新
以下清单提供了一个仅依赖于最基本方法和直接规则应用的证明:
lemma euclidean_division_existence: "∃q r. n=q⊗m⊕r"
proof (induction n)
case 0 show ?case
proof-
have "0 = 0 ⊗ m ⊕ 0" by simp
then have "∃r. 0 = 0 ⊗ m ⊕ r" by (rule exI)
then show "∃q r. 0 = q ⊗ m ⊕ r" by (rule exI)
qed
case (Suc n) show ?case sorry
qed
但是,如果您有能力更多地依赖证明自动化,那么您可以用它metis
来证明整个定理:
lemma euclidean_division_existence: "∃q r. n=q⊗m⊕r" by (metis p_0 t_0)
推荐阅读
- function - 在 pyomo 中使用 Sinc
- sql - 我的加入派生表查询有什么问题?
- objective-c - 更新 Xcode 11 后的 IOS,发现多个名为“numberOfItemsInSection:”的方法,结果、参数类型或属性不匹配
- javascript - 如何在没有用户手势的情况下在 Chrome WebExtension 中播放通知音频文件?
- javascript - 在javascript中遍历深层对象的问题
- r - 使用 sep = ">" 将一行中的多个单元格连接成一个单元格
- c# - ASP.NET MVC5 和实体框架设计问题
- android - 如何将 EditText 中的每个单词大写?
- java - 当类 C 用方法 I f(I x) 实现 I 时,为什么返回类型有自由,而参数没有?
- c++ - MinGW 的未定义符号