答案 0 :(得分:1)
如果您只是通过面板或try
调用大锤,那么您会立即获得证据:
by (metis rtrancl_empty rtrancl_idemp)
答案 1 :(得分:1)
要想知道这是如何工作的,你应该先考虑如何在纸上证明这一点。如你所见
term "Id"
Id
是一组对(类型('a * 'a) set
)。因此,您必须显示两组的相等性。规范的方法是通过显示每个集合是另一个集合的子集。
让我们从Id^* ⊆ Id
开始。如何显示一个集合是另一个集合的子集?确切地说,表明'较小'集合的每个元素也是'较大'集合的元素,即,
fix x y
assume "(x, y) ∈ Id^*"
then show "(x, y) ∈ Id"
由于传递闭包是通过归纳法定义的,我们可以通过以下方式进行归纳
by (induct) simp_all
也就是说,对于(_, _) ∈ _^*
形式(恰好是rtrancl_induct
)的前提使用默认归纳规则,然后解决基本情况以及归纳情况简化。
再一次,完整的证据
lemma
"Id^* ⊆ Id"
proof (rule subrelI)
fix x y
assume "(x, y) ∈ Id^*"
then show "(x, y) ∈ Id"
by (induct rule: rtrancl_induct) simp_all
qed
另一个方向是练习。
答案 2 :(得分:0)
我还是新手。我猜整个Isar证明是这样的:
lemma "Id^* = Id"
proof (rule equalityI)
show "Id^* ⊆ Id"
proof (rule subrelI)
fix x y
assume "(x, y) ∈ Id^*"
then show "(x, y) ∈ Id"
by (induct) simp_all
qed
next
show "Id ⊆ Id^*"
proof (rule subrelI)
fix x y
assume "(x, y) ∈ Id"
then show "(x, y) ∈ Id^*"
by (auto)
qed
qed