[英]How Agda determines a type is impossible
所以我試圖理解為什么這段代碼在()周圍給出黃色突出顯示
data sometype : List ℕ → Set where
constr : (l1 l2 : List ℕ)(n : ℕ) → sometype (l1 ++ (n ∷ l2))
somef : sometype [] → ⊥
somef ()
但事實並非如此
data sometype : List ℕ → Set where
constr : (l1 l2 : List ℕ)(n : ℕ) → sometype (n ∷ (l1 ++ l2))
somef : sometype [] → ⊥
somef ()
兩者似乎都是sometype []是空的,但是Agda無法想出第一個? 為什么? 這背后的代碼是什么? 我能否以某種方式定義somef以使第一個定義有效?
Agda不能假設像++
這樣的任意函數。 假設我們用以下方式定義++
:
_++_ : {A : Set} → List A → List A → List A
xs ++ ys = []
在這種情況下, sometype [] → ⊥
不可證明,並且接受()
荒謬模式將是一個錯誤。
在第二個示例中, sometype
的索引必須是_∷_
n ∷ (l1 ++ l2)
,這是一個構造函數表達式,因為_∷_
是一個列表構造函數。 Agda可以安全地推斷出_∷_
列表永遠不會等於[]
。 一般而言,不同的構造者可被視為不可能統一。
Agda可以對功能應用程序做些什么,盡可能減少它們。 在某些情況下,reduce會產生構造函數表達式,在其他情況下則不會,我們需要編寫其他證明。
為了證明某些類型sometype [] → ⊥
,我們應該先做一些概括。 我們不能對一個價值模式匹配sometype []
(因為的++
在類型索引),但我們可以匹配sometype xs
一些抽象xs
。 所以,我們的引理說如下:
someF' : ∀ xs → sometype xs → xs ≡ [] → ⊥
someF' .(n ∷ l2) (constr [] l2 n) ()
someF' .(n' ∷ l1 ++ n ∷ l2) (constr (n' ∷ l1) l2 n) ()
換句話說, ∀ xs → sometype xs → xs ≢ []
。 我們可以從中得出所需的證明:
someF : sometype [] → ⊥
someF p = someF' [] p refl
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.