簡體   English   中英

這種空集的形式化在 Agda 中是否正確?

[英]Is this formalization of the empty set correct in Agda?

我正在關注 Agda的 Haskell 邏輯、數學和編程之路 書中指出:

空集是平凡的關系,是兩個集合 A 和 B 之間的最小關系

在阿格達:

data ∅ : Set where

record ⊤ : Set where

record Σ (A : Set) (B : A → Set) : Set₁ where
  constructor _,_
  field
    π₁ : A
    π₂ : B π₁

_×_ : Set → Set → Set₁
A × B = Σ A (λ _ → B)
infixr 5 _×_ _,_

Relation : Set → Set₁
Relation P = P × P → Set

有了它,我可以定義特定集合的關系:

lteℕ : Relation ℕ
lteℕ(x , y) = x ≤ℕ y where
  _≤ℕ_ : ℕ → ℕ → Set
  O ≤ℕ O = ⊤
  O ≤ℕ S y = ⊤
  S x ≤ℕ O = ∅
  S x ≤ℕ S y = x ≤ℕ y
  infixr 5 _≤ℕ_

但是現在我有一個問題,因為空集關系的簽名:

  1. 不能是空集,因為我之前已經將它定義為無人居住的類型
  2. 導致錯誤Set₁ != Set when checking that the expression Set has type Set即使使用不同的符號定義為Ø: Relation Set ,因為有必要避免語言中的羅素悖論。

有沒有一種在邏輯上仍然一致的方法? 謝謝!

答案取決於你所說的集合。 如果集合是指數學集合的表示,例如列表,則空集合僅由空列表表示。

如果你所說的集合是指類型的 Agda Set ,那么答案就有點復雜了:沒有類型,但有你能想到的盡可能多的類型。 更准確地說,空類型與未提供任何構造函數的數據類型一樣多。 那么問題更多的是“我選擇這些類型中的哪一個來 model 空集? ”而不是“我如何 model 空集? ”。

這是一個強調這一方面的 agda 模塊示例:首先,我有一些導入和我的模塊的 header:

open import Agda.Primitive
open import Data.Nat hiding (_⊔_)

module EmptySets where

然后我從一個空類型開始,你能想到的越簡單:

data Empty : Set where

根據這種數據類型,可以編寫一個消除器:

Empty-elim : ∀ {a} {A : Set a} → Empty → A
Empty-elim ()

這基本上說如果Empty成立,任何事情都成立。

但是,我也可以選擇將空集表示為空關系,方法是定義一個類型族,所有類型都是空的,它們都是關系。 首先,需要定義關系(我從標准庫中獲取了定義):

REL : ∀ {a b} → Set a → Set b → (ℓ : Level) → Set (a ⊔ b ⊔ lsuc ℓ)
REL A B ℓ = A → B → Set ℓ

然后可以定義空關系族:

data EmptyRelation {a b ℓ} {A : Set a} {B : Set b} : REL A B ℓ where

由於所有這些類型都是空的,它們都提供了一個消除器:

EmptyRelation-elim : ∀ {a b x ℓ} {A : Set a} {B : Set b} {X : Set x} {u : A} {v : B} → EmptyRelation {ℓ = ℓ} u v → X
EmptyRelation-elim ()

因此,可以實例化此泛型類型以獲得特定的空類型,例如自然數上的空關系,它永遠不會成立:

EmptyNaturalRelation : REL ℕ ℕ lzero
EmptyNaturalRelation = EmptyRelation

這就是書中所解釋的:因為一個關系是一組對,那么空類型是這個關系中最小的一個:其中沒有對。

但是您也可以使用謂詞而不是關系,說空集是給定類型上的最小謂詞:永遠不成立的謂詞,在這種情況下,它表示如下:

Pred : ∀ {a} → Set a → (ℓ : Level) → Set (a ⊔ lsuc ℓ)
Pred A ℓ = A → Set ℓ

data EmptyPredicate {a ℓ} {A : Set a} : Pred A ℓ where

你可能更瘋狂,並決定 model 空集如下:

data EmptySomething {a} {A B C D E Z : Set a} : A → B → C → D → E → Z → Set where

總而言之,agda 中沒有空集,但空類型可能是無限的。


至於您在問題中提供的代碼,有幾個不准確之處:

  • 這些關系通常是在兩個 arguments 上定義的,而不是成對的參數,然后如果需要,您可以使用它們來使它們以一對作為參數。

  • 為什么要讓lteℕ依賴_≤ℕ_而不是直接定義它?

  • 您應該將lteℕ定義為數據類型,而不是返回底部或頂部的 function,這將允許您在將來對此類術語進行大小寫拆分。 通常,這是這樣定義的(在標准庫中):

     data _≤_: Rel ℕ 0ℓ where z≤n: ∀ {n} → zero ≤ ns≤s: ∀ {mn} (m≤n: m ≤ n) → suc m ≤ suc n

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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