Isabelle / HOL基金会

时间:2015-10-07 15:55:28

标签: isabelle

我看过很多关于Isabelle的语法和证明策略的文档。然而,我几乎找不到它的基础。我有几个问题,如果有人能抽出时间回答我会非常感激:

  1. 为什么Isabelle / HOL不接受不终止的功能?许多其他语言(例如Haskell)都承认非终止函数。

  2. Isabelle的元语言中有哪些符号?我读到在通用量化(/\)和暗示(==>)的元语言中有符号。但是,这些符号在对象级语言(∀和-->)中具有对应的符号。我知道-->bool => bool => bool类型的对象级函数。但是,∀和how是如何定义的?它们是对象级布尔函数吗?如果是这样,它们是不可计算的(考虑无限域)。我注意到我能够在∀和ther中编写布尔函数,但它们不可计算。那么∀和what是什么?它们是对象级别的一部分吗?如果是这样,他们是如何定义的?

  3. Isabelle定理是否只是布尔表达式?然后布尔是元语言的一部分吗?

  4. 据我所知,Isabelle是一种严格的编程语言。我怎样才能使用无限对象?比方说,无限列表。 Isabelle / HOL有可能吗?

  5. 很抱歉,如果这些问题非常基本。我似乎没有找到关于伊莎贝尔元理论的好教程。我很乐意,如果有人可以推荐我这些主题的好教程。

    非常感谢。

3 个答案:

答案 0 :(得分:10)

1)您可以在Isabelle中定义非终止(即部分)功能(参见Function package manual (section 8))。但是,部分函数更难以推理,因为无论何时您想使用其定义方程(psimps规则,它取代普通函数的simps规则),您必须证明函数首先终止于该特定输入。

一般而言,非定义和非终止等问题在逻辑中总是存在问题 - 例如,考虑函数'定义'f x = f x + 1。如果我们将此作为ℤ(整数)的等式,我们可以从两边减去f x并获得0 = 1。在Haskell中,这个问题通过说这不是ℤ上的等式,而是取决于ℤℤ∪(整数加底部)和非终止函数f评估为⊥和'''来解决'。 + 1 =⊥',所以一切都很好。

但是,如果逻辑中的每个表达式都可能评估为⊥而不是“正确”值,则此逻辑中的推理将变得非常繁琐。这就是为什么Isabelle / HOL选择将自己局限于全部功能的原因;偏好之类的东西必须用undefined(这是一个你不知道的任意值)或选项类型之类的东西来模拟。

2)我不是Isabelle / Pure(元逻辑)的专家,但最重要的符号绝对是

  • (通用元量词)
  • (元蕴涵)
  • (元等式)
  • &&&(元结合,按定义)
  • Pure.termPure.propPure.typePure.dummy_patternPure.sort_constraint,它们履行了我不太了解的某些内部内部功能。

您可以在第2.1节的Isabelle/Isar Reference Manual中找到相关信息,也可以在手册的其他地方找到更多信息。

其他所有内容(包括∀和∃,确实对布尔表达式进行操作)在对象逻辑(通常是HOL)中定义。您可以在~~/src/HOL/HOL.thy(其中~~表示Isabelle根目录)中找到定义,而不是公理化:

All_def:      "All P     ≡ (P = (λx. True))"
Ex_def:       "Ex P      ≡ ∀Q. (∀x. P x ⟶ Q) ⟶ Q"

另请注意,许多(如果不是大多数)Isabelle函数通常不可计算。 Isabelle是一种编程语言,尽管它有一个代码生成器,允许将Isabelle函数导出为编程语言的代码,只要你能为所涉及的所有函数提供代码方程式。

3) Isabelle定理是一个包含大量信息的复杂数据类型(参见~~/src/Pure/thm.ML),但最重要的部分当然是命题。一个命题来自Isabelle / Pure,它实际上只有命题和功能。 (以及itselfdummy,但您可以忽略这些。)

命题布尔 - 事实上,甚至没有办法说明命题在Isabelle / Pure中不成立。

然后,HOL定义(或更确切地说是公理化)布尔,并且还将从布尔到命题的强制公理化:Trueprop :: bool ⇒ prop

4)Isabelle 是一种编程语言,除此之外,总体并不意味着你必须将自己局限于有限结构。即使在完整的编程语言中,您也可以拥有无​​限的列表。 (参见Idris的codata

Isabelle是一个定理证明者,从逻辑上讲,无限的物体可以通过对它们进行公理化来处理,然后使用你所拥有的公理和规则对它们进行推理。

例如,HOL假定存在无限类型并定义其上的自然数。这已经允许您访问函数nat ⇒ 'a,这些函数本质上是无限列表。

您还可以使用基于有界自然仿函数的(co-)datatype package将无限列表和其他无限数据结构定义为codatatype。

答案 1 :(得分:3)

让我在你的两个问题上加上一些观点。

  

1)为什么Isabelle / HOL不接受不终止的功能?许多其他语言(如Haskell)都承认非终止函数。

简而言之:Isabelle / HOL不需要终止,但 totality (即,函数的每个输入都有特定的结果)。总体并不意味着函数在转录为(功能)编程语言时实际上终止,或者甚至根本不可计算。

因此,谈论终止有点误导,即使Isabelle / HOL的功能包使用关键字termination来证明某些属性这一事实令人鼓舞。 {1}}我将在下面再多说一点。

一方面,术语"终止"对更广泛的受众来说听起来可能更直观。另一方面,对P的更精确描述将是功能调用图的基础。

不要误解我的意思,P对于属性termination来说并不是一个糟糕的名字,甚至在函数包中实现的许多技术都是合理的。非常接近来自术语重写或函数式编程的终止技术(如大小变化原则,依赖对,词典顺序等)。

我只是说这可能会产生误导。为什么会出现这种情况的答案也涉及OP的问题4。

  

4)据我所知,Isabelle是一种严格的编程语言。我怎样才能使用无限对象?让我们说,无限列表。 Isabelle / HOL有可能吗?

Isabelle / HOL 一种编程语言,它特别有任何评估策略(我们也可以说:它有你喜欢的任何评估策略)。

这就是为什么终止这个词有误导性的原因(鼓点):如果没有评估策略,我们终止了一个函数P,人们可能会期待{{1} }终止独立于使用的策略。但这种情况并非如此。 f的{​​{1}}证明确保f定义明确。即使termination是可计算的,function的证明仅仅确保存在f终止的评估策略

(顺便说一下:我所说的&#34;策略&#34;在这里,通常受到Isabelle / HOL中所谓的 cong -rules(即同余规则)的影响。)< / p>

作为一个例子,证明函数(参见函数包文档中的第10.1节同余规则和评估顺序)是微不足道的:

f

在添加cong-rule后终止(在P定义的意义上):

f

这基本上表明逻辑 - 或应该&#34;评估&#34;从右到左。但是,如果您编写相同的功能,例如在OCaml中,它会导致堆栈溢出...

答案 2 :(得分:1)

编辑:这个答案并不正确,请查看下面的Lars评论。

不幸的是我没有足够的声誉将此作为评论发布,所以这是我的回答(请记住我不是Isabelle的专家,但我也有过类似的问题):

1)想法是证明关于已定义函数的陈述。我不确定你对可计算性理论有多熟悉,但想想停止问题和最不可靠性问题源于它的事实(如接受问题)。想象一下定义一个你无法证明它终止的函数。那么当你给出输入“ABC”并且它没有进入无限循环时你怎么能证明它返回数字42?

相反,如果你限制自己终止功能,你可以更多地了解它们,基本上做出权衡(或者至少这是我看到的)。

这些想法源于建构主义和直觉主义,我建议你查看Robert Harper非常有趣的系列讲座:https://www.youtube.com/watch?v=9SnefrwBIDc&list=PLGCr8P_YncjXRzdGq2SjKv5F2J8HUFeqN关于类型论

你应特别查看关于缺少中间排除法的部分:http://youtu.be/3JHTb6b1to8?t=15m34s

2)见曼努埃尔的答案。

3,4)再次看Manuel的回答牢记直觉逻辑:“基本实体不是布尔,而是证明某事是真的”。

对我来说,花了很长时间才适应这种思维方式,我仍然不确定我理解它。我认为关键在于理解它是一种或多或少完全不同的思维方式。