Isabelle 身份关系的传递闭包

Isabelle 身份关系的传递闭包,isabelle,Isabelle,我无法在中证明以下引理: 关于如何证明这一点,你有什么想法吗?如果你只是调用sledgehammer(通过面板,或通过尝试),那么你会立即得到证据: by (metis rtrancl_empty rtrancl_idemp) 要想知道这是怎么回事,你应该首先考虑如何在纸上证明这一点。如你所见 term "Id" Id是一组对(type('a*'a)set)。因此,你必须证明两个集合相等。这样做的标准方法是显示每个集合是另一个集合的子集 让我们从Id^*开始⊆ Id。如何显示一个集合是另一个

我无法在中证明以下
引理


关于如何证明这一点,你有什么想法吗?

如果你只是调用sledgehammer(通过面板,或通过
尝试),那么你会立即得到证据:

by (metis rtrancl_empty rtrancl_idemp)

要想知道这是怎么回事,你应该首先考虑如何在纸上证明这一点。如你所见

term "Id"
Id
是一组对(type
('a*'a)set
)。因此,你必须证明两个集合相等。这样做的标准方法是显示每个集合是另一个集合的子集

让我们从
Id^*开始⊆ Id
。如何显示一个集合是另一个集合的子集?确切地说,表明“较小”集合的每个元素也是“较大”集合的元素,即

fix x y
assume "(x, y) ∈ Id^*"
then show "(x, y) ∈ Id"
由于传递闭包是归纳式定义的,我们可以通过归纳如下

by (induct) simp_all
也就是说,使用默认的归纳规则作为
(u,u)形式的前提∈ _^*
(正好是
rtrancl\u import
),然后通过简化来解决基本情况和归纳情况

再一次,充分的证据

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

另一个方向是作为练习离开。

我对此还是新手。我猜整个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

没什么好猜测的,当伊莎贝尔接受证据时,一切都很好;)
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