将一个引理前提分解为定义会导致isabelle中证明方法(自动)应用失败

时间:2014-11-06 22:30:42

标签: isabelle isar

我在Isabelle中有以下代码:

typedecl Person
consts age :: "Person ⇒ int" 

lemma "⟦(∀p::Person. age p > 20);p ∈ Person⟧⟹ age p > 20"
apply (auto)
done

自动证明方法运行正常并证明了引理!当我想在引理中将前提的第一部分分解为定义C1如下:

definition C1::bool where "C1 ≡ (∀p::Person. age p > 20)"

auto 方法无法在以下代码中证明:

lemma "⟦C1;p ∈ Person⟧⟹ age p > 20"
apply (auto)
done

为什么会这样?如果我在分解第一个假设的方式上做错了 - 我这样做是为了组织假设看起来整洁有序 - 这样做的最佳方法是什么,不影响证明方法(自动)功能。

由于

2 个答案:

答案 0 :(得分:1)

构造definition用作抽象实现细节的方法。其用途之一是证明相关术语的某些属性,然后依赖属性而不是术语声明本身。因此,定义术语的简化规则不会自动添加到simpset。规则仍然可以使用带有后缀_def的术语名称,并且可以明确使用:

lemma "⟦C1; p ∈ Person⟧ ⟹ age p > 20"
  apply (auto simp add: C1_def)
done

答案 1 :(得分:1)

首先,为了实际添加一些值,我展示了如何使用declareC1_def添加为simp规则。然后我给你一些关于你lemma的未经请求的指针,然后我给你一些关于Stackoverflow礼仪的指示(从我的观点来看)。

将定义声明为简单规则

正如亚历山大指出的那样,definition不会自动添加为simp规则。

您可以将其声明为simp规则,如下所示:

declare C1_def [simp add]

自动校对方法autosimpfastforce等使用simp规则会导致错误的循环,或者以不同的方式扩展公式想要扩展公式,所以在添加公式后,您可以将其删除为simp规则,如下所示:

declare C1_def [simp del]

关于你的引理的评论

你的引理中的公式可能就是你想要的,但在我看来,你的符号是一个混淆的潜在根源。特别是,您使用Person作为类型名称和集合变量。我在不要求澄清的情况下发表这些评论。

对于我自己,我的问题是," p ∈ Person如何不给出错误,因为Person有一个集合,其中Person位于typedecl Person不是一个集合。

获取更多信息的一种方法是declare [[show_types, show_consts]]

为了回答我的问题,我做了以下(转换符号以便浏览器移植),并展示了我在输出面板中看到的一些内容:

declare [[show_types, show_consts]]
lemma "[|(!p::Person. age p > 20); p ∈ Person|] ==> (age p > 20)"
oops
(*OUTPUT:
  variables:
    Person :: Person set
    p :: Person *)

它告诉我Person是一个自由变量。至于p,它是(!p::Person. age p > 20)中的约束变量,但在其余的引理中它是自由的,因此您的假设包括每p个类型Person中包含Person set类型。

可能是你想要的,但在这种情况下,它没有区别,因为你的引理基本上是A and B implies A形式。

您需要接受回答SO问题的答案

在我大约2小时后消失之前,对于isabelle标签,我再次作为SO礼仪警察履行我心爱的职责。

你问了三个问题。特别是,有一个:

这是一个直截了当的问题,并给出了直截了当的答案。你需要接受它作为答案。否则,

  • 当人们点击"未答复的" " isabelle"的标签标记,它可能会显示为未答复,如果没有答案,
  • 你没有表现出适当的欣赏,你应该给予答案。

在我链接的问题的情况下,你得到了一位Isbelle / HOL专家的回答(与我不同)。一个人输入这样的答案需要花费大量的时间。它不是特别长,但它也不是一个单行。