[英]What does “Error: Universe inconsistency” mean in Coq?
我正在通過Software Foundations工作,目前正在對教堂數字進行練習。 這是自然數的類型簽名:
Definition nat := forall X : Type, (X -> X) -> X -> X.
我已經定義了succ
nat -> nat
類型的函數succ
。 我現在想定義一個附加函數,如下所示:
Definition plus (n m : nat) : nat := n nat succ m.
但是,我收到以下錯誤消息:
Error: Universe inconsistency.
此錯誤消息實際上是什么意思?
在Coq中,所有事物都有一個類型。 Type
也不例外:如果您使用Check
命令詢問Coq,它將告訴您其類型為... Type
!
實際上,這是一個謊言。 如果您通過發出指令“ Set Printing Universes.
詢問更多詳細信息Set Printing Universes.
,Coq會告訴您Type
與第一個不同,而是一個“更大”的類型。 形式上,每個Type
都有一個與其關聯的索引,稱為其Universe級別。 通常在打印表達式時該索引不可見。 因此,對於任何索引j > i
,該問題的正確答案是Type_i
具有Type_j
類型。 這是確保Coq理論的一致性所必需的:如果只有一個Type
,則有可能表現出矛盾,類似於假設集合中有所有集合的情況下集合理論中的矛盾。
為了簡化使用類型索引的工作,Coq為您提供了一定的靈活性:實際上,沒有任何類型具有與之關聯的固定索引。 取而代之的是,每次您寫Type
時,Coq都會生成一個新的索引變量,並跟蹤內部約束以確保可以用滿足理論要求的約束的具體值實例化它們。
您看到的錯誤消息表示Coq的Universe級約束求解器表示您所要求的約束系統沒有解決方案。 問題是,在forall
中的定義nat
是在量化Type_i
,但勒柯克的邏輯力量nat
是自身類型Type_j
,與j > i
。 另一方面,應用程序n nat
要求j <= i
,這導致索引約束集不令人滿意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.