梅蒂斯:未使用的定理在这种情况下是什么意思?
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。上述参考资料包含许多与您正在处理的问题非常相似的示例。
不幸的是,我对 sledgehammer
和 metis
的了解还不够,无法告诉您为什么在使用 sledgehammer
的输出来证明定理时会产生警告。有关 sledgehammer
和 metis
的更多信息,请参阅 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
我是 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。上述参考资料包含许多与您正在处理的问题非常相似的示例。
不幸的是,我对 sledgehammer
和 metis
的了解还不够,无法告诉您为什么在使用 sledgehammer
的输出来证明定理时会产生警告。有关 sledgehammer
和 metis
的更多信息,请参阅 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