非终止归纳谓词

时间:2017-04-28 07:04:28

标签: isabelle induction non-termination

在优秀的Programming and Proving in Isabelle/HOL中说

  

[...]与递归函数相比,没有终止要求   用于归纳定义。 (pdf第40页)

  1. 这是否意味着存在可以有无限深度推导树的归纳定义?
  2. 这种非终止推导的例子是什么(最好是具有无限高度的推导)?你如何“构建”这些?
  3. 这些规则归纳原则如何仍然健全?

2 个答案:

答案 0 :(得分:2)

  1. 否。你需要一个共同的谓词。
  2. 不存在。
  3. 如果你看一下归纳原理,你会发现它们有一个额外的前提。例如,"甚至n"。这意味着,在您甚至可以应用归纳原理之前,您需要知道手头有一个有限的推导。

答案 1 :(得分:2)

Lars已经回答了这个问题,但我想扩展他提到的共同谓词。这些确实允许你拥有“无限深层的派生树”,对应于编码类型本质上是“可能是无限数据类型”。

一个很好的例子是来自stream的{​​{1}}类型:

~~/src/HOL/Library/Stream

这是一个无限列表(请注意,与Haskell列表不同,此流类型具有无限长,就像您在Haskell中编写codatatype 'a stream = SCons 'a "'a stream" (infixr "##" 65) 一样,尽管Haskell风格可能无限'列表也可以直截了当,参见AFP中的懒惰列表)

然后你可以定义其值来自给定集的所有流的集合。您可以将其定义为datatype Stream a = SCons a (Stream a),但在Isabelle中,它的定义是这样的:

streams A = {s. sset s ⊆ A}

另一个,也许更简单的例子,就是对所有元素的谓词“coinductive”:

coinductive_set streams :: "'a set ⇒ 'a stream set" for A :: "'a set"
  where "⟦a ∈ A; s ∈ streams A⟧ ⟹ a ## s ∈ streams A"

关于如何构造这样一个无限推导树的问题,即表明一个共同谓词具有某种价值,你必须用共同诱导来做到这一点。例如。我们可以证明,如果coinductive sall :: "('a ⇒ bool) ⇒ 'a stream ⇒ bool" for P :: "'a ⇒ bool" where "P x ⟹ sall P xs ⟹ sall P (x ## xs)" 成立,则P x成立,其中sall P (sconst x)只是无限重复的值sconst x

x