![](/img/trans.png)
[英]Isabelle code generation for terminating uses of possibly non-terminating functions
[英]Non-terminating inductive predicates
在Isabelle / HOL中出色的編程和證明中,它說
與遞歸函數相反,歸納定義沒有終止要求。 (pdf第40頁)
拉爾斯已經回答了這個問題,但是我想補充一下他提到的共性謂詞。 這些確實使您可以擁有“無限深的派生樹”,與協數據類型本質上是“可能無限的數據類型”相對應。
一個很好的例子是~~/src/HOL/Library/Stream
的stream
類型:
codatatype 'a stream = SCons 'a "'a stream" (infixr "##" 65)
這是一個無限列表(請注意,與Haskell列表不同,此流類型必須是無限長的,就像您在Haskell中寫datatype Stream a = SCons a (Stream a)
,盡管Haskell樣式的“潛在無限”列表也是如此)可能簡單明了,請參閱AFP中的惰性列表)
然后,您可以例如定義其值來自給定集合的所有流的集合。 您可以將其定義為streams A = {s. sset s ⊆ A}
streams A = {s. sset s ⊆ A}
s⊆A streams A = {s. sset s ⊆ A}
,但是在伊莎貝爾(Isabelle)中,它是這樣概括地定義的:
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
:
lemma sconst_reduce: "sconst x = x ## sconst x"
by (subst siterate.code) simp_all
lemma sall_sconst: "P x ⟹ sall P (sconst x)"
proof (coinduction rule: sall.coinduct)
assume "P x"
thus "∃y ys. sconst x = y ## ys ∧ P y ∧ (ys = sconst x ∧ P x ∨ sall P ys)"
by (subst sconst_reduce) auto
qed
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.