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

将引理前提分解为定义会导致isabelle中的证明方法(auto)应用失败,isabelle,isar,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 > 2

我在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)"
自动方法无法在以下代码中证明:

lemma "⟦C1;p ∈ Person⟧⟹ age p > 20"
apply (auto)
done
为什么会发生这种情况?如果我在分解第一个假设的方式上做错了——我这样做是为了组织假设,使其看起来整洁有序——在不影响证明方法(自动)功能的情况下,做这件事的最佳方式是什么


感谢

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

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

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

将定义声明为simp规则 正如Alexander指出的,
定义
不会自动添加为
simp
规则

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

declare C1_def [simp add]
declare C1_def [simp del]
自动验证方法
auto
simp
fastforce
等使用simp规则可能会导致坏循环,或者以您不希望公式扩展的方式扩展公式,因此添加后,您可以将其作为
simp
规则删除,如下所示:

declare C1_def [simp add]
declare C1_def [simp del]
关于引理的评论 可能你引理中的公式正是你想要的,但在我看来,你的符号是一个潜在的混淆源。特别是,您正在使用
Person
作为类型和集合变量的名称。我在没有要求澄清的情况下发表这些评论

对我自己来说,我的问题是,“这是怎么回事∈ Person
没有给出错误,因为
Person
有一个集合,其中
typedecl-Person
中的
Person
不是集合

获取更多信息的一种方法是使用
declare[[show\u types,show\u 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)
中的一个约束变量,但在引理的其余部分是自由的,所以你的假设包括了这样一个公式,即
Person
类型的每个
p
都在每个类型的
人集中

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

你需要接受一个问题的答案 在我消失大约两个小时之前,为了《伊莎贝尔》
标签,我又一次履行了我心爱的义务,成为一名礼仪警察

你问了三个问题,特别是:

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

  • 当人们点击“isabelle”标签的“unanswered”标签时,它可能会显示为unanswered,当它未被应答时
  • 你没有表现出应有的感激之情,没有表现出应有的感激之情

对于我链接到的问题,您从一位Isbelle/HOL专家那里得到了答案(与我不同)。一个人输入这样的答案需要花费大量的时间。答案不是特别长,但也不是一行。

谢谢用户3317019,我是这个网站的新手,不知道接受答案的机制。我在提到的问题中设置了“已回答”标签,使其成为合适的答案。