簡體   English   中英

agda中的非平凡否定

[英]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 _) = ⊤

現在,請注意上面的消除器的兩種情況(即sz情況)都返回類型為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.

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