[英]Non trivial negation in agda
所有的否定,即我見過的形式A - >底部格式的結論來自荒謬的模式匹配。 還有其他可以在agda中得到否定的情況嗎? 依賴類型理論中是否存在其他可能的情況?
類型理論通常沒有模式匹配的概念(並且通過擴展荒謬的模式),但它們可以證明你所描述的那種類型的否定。
首先,我們必須查看數據類型。 如果沒有模式匹配,您可以通過引入和刪除規則來表征它們。 引言規則基本上是構造函數,它們告訴您如何構造該類型的值。 另一方面,消除規則告訴您如何使用該類型的值。 還有相關的計算規則(β減少,有時是η減少),但我們現在不需要處理它們。
消除規則看起來有點像折疊(至少對於正面類型)。 例如,這里是自然數的消除規則在Agda中的樣子:
ℕ-elim : ∀ {p} (P : ℕ → Set p)
(s : ∀ {n} → P n → P (suc n))
(z : P 0) →
∀ n → P n
ℕ-elim P s z zero = z
ℕ-elim P s z (suc n) = s (ℕ-elim P s z n)
雖然Agda確實有引入規則(構造函數),但它沒有消除規則。 相反,它有模式匹配,如上所示,我們可以用它恢復消除規則。 但是,我們也可以進行相反的操作:我們可以使用消除規則來模擬模式匹配。 說實話,它通常更加不方便,但它可以做到 - 上面提到的消除規則基本上在最外層的構造函數上進行模式匹配,如果我們需要更深入,我們可以再次應用消除規則。
所以,我們可以模擬模式匹配。 荒謬的模式怎么樣? 舉個例子,我們將采用第四個Peano公理:
peano : ∀ n → suc n ≡ zero → ⊥
然而,有一個技巧涉及(事實上,它是非常關鍵的;在Martin-Löf的沒有宇宙的類型理論中,如果沒有這個技巧,你就無法做到這一點,參見本文 )。 我們需要構造一個函數,它將根據其參數返回兩個不同的類型:
Nope : (m n : ℕ) → Set
Nope (suc _) zero = ⊥
Nope _ _ = ⊤
如果m ≡ n
,我們應該能夠證明Nope mn
成立(居住)。 事實上,這很容易:
nope : ∀ m n → m ≡ n → Nope m n
nope zero ._ refl = _
nope (suc m) ._ refl = _
您現在可以看到它的前進方向。 如果我們對“ suc n ≡ zero
的“壞”證明應用nope
,則Nope (suc n) zero
將減少到⊥
,我們將獲得所需的函數:
peano : ∀ n → suc n ≡ zero → ⊥
peano _ p = nope _ _ p
現在,你可能會注意到我有點作弊。 我使用了模式匹配,盡管我之前說過,這些類型理論沒有模式匹配。 我會彌補,對於下面的例子,但我建議你試圖證明peano
不上號模式匹配(使用ℕ-elim
上面給出); 如果你真的想要一個硬核版本,那么在沒有相等的模式匹配的情況下做它並使用這個消除器代替:
J : ∀ {a p} {A : Set a} (P : ∀ (x : A) y → x ≡ y → Set p)
(f : ∀ x → P x x refl) → ∀ x y → (p : x ≡ y) → P x y p
J P f x .x refl = f x
另一種流行的荒誕模式是關於Fin 0
類型的東西(從這個例子中,你會明白如何模擬其他類似荒謬的匹配)。 所以,首先,我們需要Fin
消除器。
Fin-elim : ∀ {p} (P : ∀ n → Fin n → Set p)
(s : ∀ {n} {fn : Fin n} → P n fn → P (suc n) (fsuc fn))
(z : ∀ {n} → P (suc n) fzero) →
∀ {n} (fn : Fin n) → P n fn
Fin-elim P s z fzero = z
Fin-elim P s z (fsuc x) = s (Fin-elim P s z x)
是的,這種類型真的很難看。 無論如何,我們將使用相同的技巧,但這一次,我們只需要依賴一個數字:
Nope : ℕ → Set
Nope = ℕ-elim (λ _ → Set) (λ _ → ⊤) ⊥
請注意,這相當於:
Nope zero = ⊥
Nope (suc _) = ⊤
現在,請注意上面的消除器的兩種情況(即s
和z
情況)都返回類型為P (suc n) _
。 如果我們選擇P = λ n _ → Nope n
⊤
P = λ n _ → Nope n
,我們將不得不返回兩種類型的something類型 - 但這很容易! 事實上,這很簡單:
bad : Fin 0 → ⊥
bad = Fin-elim (λ n _ → Nope n) (λ _ → _) _
你可能想知道的最后一件事是我們如何從⊥
獲得任何類型的價值(在邏輯中稱為ex falso quodlibet )。 在Agda,我們顯然有:
⊥-elim : ∀ {w} {Whatever : Set w} → ⊥ → Whatever
⊥-elim ()
但事實證明,這恰恰是⊥
的消除者,因此在類型理論中定義這種類型時給出了它。
你在問類似的東西嗎?
open import Relation.Nullary
→-transposition : {P Q : Set} → (P → Q) → ¬ Q → ¬ P
→-transposition p→q ¬q p = ¬q (p→q p)
?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.