[英]How to choose the design for a well-founded inductive type?
在研究有根據的時候,我想看看不同的設計是如何表現的。 例如,對於一個類型:
data _<_ (x : Nat) : Nat -> Set where
<-b : x < (suc x)
<-s : (y : Nat) -> x < y -> x < (suc y)
有根據很容易證明。 但是如果類似的類型定義不同:
data _<_ : Nat -> Nat -> Set where
z-< : (m : Nat) -> zero < (suc m)
s<s : (m n : Nat) -> m < n -> (suc m) < (suc n)
很明顯,在這兩種情況下,下降鏈都不是無限的,但在第二種情況下,有根據並不容易證明:不容易證明(y -> y < x -> Acc y)
存在於給定的x
。
是否有一些原則可以幫助選擇第一個設計而不是第二個設計?
證明第二個定義的有根據並不難,它只需要額外的定理。 在這里,依靠_==_
對於Nat
的可判定性,我們可以為案例(suc y) != x
構造新的_<_
,並且可以重寫目標類型以使用已知尺寸減小問題的解決方案為成功的解決suc y
。
-- trying to express well-foundedness is tricky, because of how x < y is defined:
-- since both x and y decrease in the inductive step case, need special effort to
-- prove when the induction stops - when no more constructors are available
<-Well-founded : Well-founded Nat _<_
<-Well-founded x = acc (aux x) where
aux : (x y : Nat) -> y < x -> Acc _<_ y
aux zero y ()
aux x zero z-< = acc \_ ()
aux (suc x) (suc y) (s<s y<x) with is-eq? (suc y) x
... | no sy!=x = aux x (suc y) (neq y<x sy!=x)
... | yes sy==x rewrite sy==x = <-Well-founded x
第一個定義在某種意義上是“規范的”,而第二個定義不是。 在 Agda 中,每一種歸納類型都有一個有充分根據和傳遞性的子項關系,盡管不一定是完全的、可判定的或證明無關的。 對於 W 型,如下所示:
open import Data.Product
open import Data.Sum
open import Relation.Binary.PropositionalEquality
data W (S : Set)(P : S → Set) : Set where
lim : ∀ s → (P s → W S P) → W S P
_<_ : ∀ {S P} → W S P → W S P → Set
a < lim s f = ∃ λ p → a ≡ f p ⊎ a < f p
如果我們將Nat
定義為 W 類型,那么泛型_<_
與第一個定義相同。 即使我們不知道Nat
的構造函數,第一個定義也建立了子項關系。 第二個定義只是一個子項關系,因為我們知道每個suc n
都可以達到zero
。 如果我們添加了一個額外的zero': Nat
構造函數,那么情況將不再如此。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.