在优秀的Programming and Proving in Isabelle/HOL中说
[...]与递归函数相比,没有终止要求 用于归纳定义。 (pdf第40页)
答案 0 :(得分:2)
答案 1 :(得分:2)
一个很好的例子是来自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