[英]In Coq, why is `nat` a `Type`, even though it's actually a `Set`?
Check nat. (* => Set *)
但是我能夠將nat
傳遞給采用Type
參數的函數,即使Set
和Type
不相同。 話雖這么說, Type
顯然不僅僅是包羅萬象——例如,嘗試將文字5
(類型為nat
的值)傳遞給采用Type
為參數的 function 會導致錯誤。
那么,為什么Set
類型的對象在它期望Type
的地方被允許,而nat
類型的值卻不允許呢?
類型是對象的集合,它們的行為都相似。 務實地使用它以確保正確使用功能。 例如,如果您說 function 將一個自然數作為輸入,那么您希望它在接收1
作為輸入以及接收3
作為輸入時都能正常工作。 在這方面, 1
和3
表現相似。
現在, nat
是集合的名稱。 它與數字1
或3
非常不同,你不同意嗎? 這就是為什么您不能將1
或3
作為 arguments 傳遞給接受nat
作為參數的 function 的原因。
但是nat
的類型是什么? 好吧, nat
是一種類型,所以人們會期望寫成nat: Type
來准確地說,但有一個微妙之處。 它來自於Type
本身應該有一個類型這一事實。
在 Coq 中,有一個幾乎不可見的對象序列,名為Type_0
Type_1
,例如Type_0: Type_1
、 Type_1: Type_2
等,具有子類型化規則,因此x: Type_i
足以同時具有x: Type_(i+1)
,並且從技術上講, Set
只是Type_0
的另一個名稱。 換句話說, Set
是其元素本身不是類型的所有類型的類型。
每個 object 類型Set
也有類型Type_i
。
默認情況下, Type_i
的索引i
是不打印的,所以有時會有點混亂。
粗略地說, Set
是 Type 的子Type
,因此每個作為Set
的T
都可以在需要Type
的地方使用。
您可能也對這個答案感興趣,它討論了Set
和Type
之間的區別。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.