簡體   English   中英

在 Coq 中,為什么 `nat` 是一個 `Type`,盡管它實際上是一個 `Set`?

[英]In Coq, why is `nat` a `Type`, even though it's actually a `Set`?

Check nat. (* => Set *)

但是我能夠將nat傳遞給采用Type參數的函數,即使SetType不相同。 話雖這么說, Type顯然不僅僅是包羅萬象——例如,嘗試將文字5 (類型為nat的值)傳遞給采用Type為參數的 function 會導致錯誤。

那么,為什么Set類型的對象在它期望Type的地方被允許,而nat類型的值卻不允許呢?

類型是對象的集合,它們的行為都相似 務實地使用它以確保正確使用功能。 例如,如果您說 function 將一個自然數作為輸入,那么您希望它在接收1作為輸入以及接收3作為輸入時都能正常工作。 在這方面, 13表現相似。

現在, nat是集合的名稱。 它與數字13非常不同,你不同意嗎? 這就是為什么您不能將13作為 arguments 傳遞給接受nat作為參數的 function 的原因。

但是nat的類型是什么? 好吧, nat是一種類型,所以人們會期望寫成nat: Type來准確地說,但有一個微妙之處。 它來自於Type本身應該有一個類型這一事實。

在 Coq 中,有一個幾乎不可見的對象序列,名為Type_0 Type_1 ,例如Type_0: Type_1Type_1: Type_2等,具有子類型化規則,因此x: Type_i足以同時具有x: Type_(i+1) ,並且從技術上講, Set只是Type_0的另一個名稱。 換句話說, Set是其元素本身不是類型的所有類型的類型。

每個 object 類型Set也有類型Type_i

默認情況下, Type_i的索引i是不打印的,所以有時會有點混亂。

粗略地說, Set是 Type 的子Type ,因此每個作為SetT都可以在需要Type的地方使用。

您可能也對這個答案感興趣,它討論了SetType之間的區別。

暫無
暫無

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

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