梅蒂斯:未使用的定理在这种情况下是什么意思?

What does Metis: Unused theorems mean in this context?

我是 Isabelle 的新手,如果这个问题格式不正确,我深表歉意。

我正在尝试证明以下内容:

record 
  Point =
    x :: nat
    y :: nat

definition
  cond :: "Point ⇒ Point ⇒ "
where
  "cond point1 point2 ≡ 
     abs (x point1 - x point2) = 1 ∨ abs (y point1 - y point2) = 1"

我的证明是:

lemma cond_proof : "∃ point1 point2 . cond point1 point2 = True"
  sledgehammer
  by (metis Point_ext_def abs_division_segment add_diff_cancel_left' cond_def select_convs(1))

这会触发警告:

Metis: Unused theorems:

谁能解释一下这是什么意思? 如果可能的话,帮我得出一个满足这个条件的证明。

我对 Isabelle 还是很陌生,所以欢迎所有评论。

我可以评论与您的​​问题相关的一些实际方面。我相信,警告是不言自明的。通常,您可以删除未使用的定理,metis 仍然能够证明感兴趣的定理(参见下面代码清单中的 cond_proof_metis)。

引理cond_proof可以通过展示两个满足引理条件的点来证明。我相信这种方法可能被认为比使用 sledgehammer 发现的默认证明更好。我已经在下面的代码清单中的引理 cond_proof_Isar 中展示了如何做到这一点。有更紧凑的方式来展示示例。但是,鉴于您对 Isabelle 还很陌生,我遵循了我认为最自然的方法。

我不确定您是否故意在证明中留下命令 sledgehammer。但是,在大多数情况下,这不是您希望做的事情。 sledgehammer 找到证明后,您可以从证明中删除命令 sledgehammer

作为旁注,我建议您完成 Tobias Nipkow 等人的“高阶逻辑的证明助手”和“具有 [=40 的具体语义学”一书中的一些示例和练习=]”,作者:Tobias Nipkow 和 Gerwin Klein。上述参考资料包含许多与您正在处理的问题非常相似的示例。

不幸的是,我对 sledgehammermetis 的了解还不够,无法告诉您为什么在使用 sledgehammer 的输出来证明定理时会产生警告。有关 sledgehammermetis 的更多信息,请参阅 Jasmin Christian Blanchette 编写的 'A User’s Guide to Sledgehammer for Isabelle/HOL',可以在标准 Isabelle 文档中找到。当然,关于 metis 的更多信息也可以在网上找到(例如 http://www.gilith.com/metis/)。希望比我更有知识的人能够提供有关您的查询的更多详细信息。

section ‹Auxiliary commands›
theory Scratch
  imports Complex_Main
begin

record Point =
    x :: nat
    y :: nat

definition
  cond :: "Point ⇒ Point ⇒ bool"
where
  "cond point1 point2 ≡ 
     abs (x point1 - x point2) = 1 ∨ abs (y point1 - y point2) = 1"

(*Point_ext_def was part of the output produced by sledgehammer and is
listed as unused by metis. It can be removed with no effect on the
ability of metis to prove the result of interest.*)
lemma cond_proof_metis : "∃ point1 point2 . cond point1 point2 = True"
  by (metis (*Point_ext_def*) 
      abs_1 add_diff_cancel_left' cond_def of_nat_1_eq_iff select_convs(1))

lemma cond_proof_Isar : "∃point1 point2 . cond point1 point2 = True"
proof(intro exI) 
  define point1::Point where point1: "point1 ≡ ⦇x = 2, y = 0⦈"
  define point2::Point where point2: "point2 ≡ ⦇x = 1, y = 0⦈"
  show "cond point1 point2 = True"
    unfolding cond_def point1 point2 by auto
qed

end

伊莎贝尔版本:伊莎贝尔2020