簡體   English   中英

Agda如何確定一種類型是不可能的

[英]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.

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