我有以下定义:
definition someRel :: "nat rel"
where
"someRel = {(1, 2), (2, 3), (3, 4), (4, 5)}"
我想证明以下问题:
lemma "someRel^*``{1}={1, 2, 3, 4, 5}"
我设计了以下证据:
proof
show "someRel^*``{1} ⊆ {1, 2, 3, 4, 5}"
proof
fix x
assume "x ∈ someRel⇧* `` {1}"
then show "x ∈ {1, 2, 3, 4, 5}"
using assms someRel_def by (auto elim: rtranclE)
qed
next
show "{1, 2, 3, 4, 5} ⊆ someRel^*``{1}"
proof
fix x
assume "x ∈ {1::nat, 2, 3, 4, 5}"
then show "x ∈ someRel⇧* `` {1}"
using assms someRel_def Image_singleton by (induction) blast+
qed
qed
此证明存在以下问题:
show "someRel^*``{1} ⊆ {1, 2, 3, 4, 5}"
)
rtranclE
。如果我再添加一对someRel
关系(例如对(6, 7)
)show "{1, 2, 3, 4, 5} ⊆ someRel^*``{1}"
)的证明不会终止。有人能提出更好的证据吗? (a)允许someRel
关系中的更多对和(b)终止。
答案 0 :(得分:2)
事实证明,对于您的特定实例(以及我尝试的一些稍微大一些),以下内容足够(首先应用auto
然后对其余目标运行sledgehammer
以确定有用的事实,如converse_rtrancl_into_rtrancl
这里):
by (auto simp: someRel_def converse_rtrancl_into_rtrancl elim: rtranclE)
但是,一般情况下,最好执行以下操作之一:
simp
- 可能很慢 - 或通过eval
- 据我所知,它是一种神谕)。 对于后者的AFP条目 Executable Transitive Closures可能会引起人们的兴趣。
更新:我添加了一个simproc的例子,通过评估AFP的开发版本来计算有限集上有限传递闭包的图像。但是,我根据示例而不是可执行传输闭包
Executable Transitive Closures of Finite Relations。你的例子可以在理论的最后找到
Finite_Transitive_Closure_Simprocs
(一旦AFP网站与底层的mercurial存储库同步)。
更新:请注意,上面提到的simproc专门针对r^* `` x
形式的模式,其中集合r
和x
在某种意义上是有限的它们以有限集合符号{x1, x2, ..., xN}
给出。因此,为了触发特定目标,您可能必须添加其他事实/简单规则/ simprocs / ...以便将表达式规范化为此形式。
示例:如果您有目标
"(converse someRel)^* `` {1} = {1}"
你必须添加实际上适用的规则"给定有限集上的converse
运算。以下是:
lemma [simp]:
"converse (insert (x, y) A) = insert (y, x) (converse A)"
by auto
现在可以通过
解决目标 by (auto simp: someRel_def)
答案 1 :(得分:0)
添加到Chris的答案,这里是一个完整版本,它使用AFP条目进行传递闭包,并使用code-simp
代替eval
。 code-simp
比eval
慢一点,但不依赖于神谕。
theory Test
imports "$AFP/Transitive-Closure/Transitive_Closure_List_Impl"
begin
lemma to_memo_list: "(set xs)^* `` {a} = set (memo_list_rtrancl xs a)"
unfolding memo_list_rtrancl Image_def by auto
definition someRel :: "nat rel"
where
"someRel = {(1, 2), (2, 3), (3, 4), (4, 5), (5,3)}"
definition someRel_list :: "(nat × nat)list"
where
"someRel_list = [(1, 2), (2, 3), (3, 4), (4, 5), (5,3)]"
lemma someRel_list: "someRel = set someRel_list" by code_simp
lemma "someRel^*``{4}={3, 4, 5}"
unfolding someRel_list to_memo_list by code_simp
end