[英]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 _≤ℕ_
但是現在我有一個問題,因為空集關系的簽名:
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.