簡體   English   中英

非終止歸納謂詞

[英]Non-terminating inductive predicates

Isabelle / HOL中出色的編程和證明中,它說

與遞歸函數相反,歸納定義沒有終止要求。 (pdf第40頁)

  1. 這是否意味着可以有無限深的推導樹的歸納定義?
  2. 這種非終止推導(最好是無限高的推導)的例子是什么? 您如何“構建”這些?
  3. 關於這些的規則歸納原理仍然如何?
  1. 不需要。為此您需要使用謂詞。
  2. 不存在。
  3. 如果看一下歸納原理,您會發現它們還有一個前提。 例如,“偶數n”。 這意味着,在甚至可以應用歸納原理之前,您需要知道手頭有一個有限的推導。

拉爾斯已經回答了這個問題,但是我想補充一下他提到的共性謂詞。 這些確實使您可以擁有“無限深的派生樹”,與協數據類型本質上是“可能無限的數據類型”相對應。

一個很好的例子是~~/src/HOL/Library/Streamstream類型:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM