身份关系的传递性封闭

时间:2014-08-27 13:42:43

标签: isabelle

我无法在Isabelle中证明以下lemma

lemma "Id^* = Id"

关于如何证明这一点的任何想法?

3 个答案:

答案 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