教会数字和宇宙不一致
Church numerals and universe inconsistency
在下面的代码中,语句 add'_commut
被 Coq 接受,但 add_commut
由于全域不一致而被拒绝。
Set Universe Polymorphism.
Definition nat : Type := forall (X : Type), X -> (X -> X) -> X.
Definition succ (n : nat) : nat := fun X z s => s (n X z s).
Definition add' (m n : nat) : nat := fun X z s => m X (n X z s) s.
Definition nat_rec (z : nat) (s : nat -> nat) (n : nat) : nat := n nat z s.
Definition add (m n : nat) : nat := nat_rec n succ m.
Definition equal (A : Type) (a : A) : A -> Type := fun a' => forall (P : A -> Type), P a -> P a'.
Lemma add'_commut (m n : nat) : equal nat (add' m n) (add' n m).
Admitted.
Lemma add_commut (m n : nat) : equal nat (add m n) (add n m).
(*
In environment
m : nat
n : nat
The term "add n (fun X : Type => m X)" has type
"nat@{Top.1078 Top.1079}"
while it is expected to have type
"nat@{Top.1080 Top.1078}" (universe inconsistency).
*)
如何让它通过?
教堂数字只有在您打开祈使句 Set
时才有效,方法是将 -arg -impredicative-set
放入 _CoqProject
文件或使用 -impredicative-set
命令行选项。然后定义nat
为:
Definition nat : Set := forall (X : Set), X -> (X -> X) -> X.
Impredicative Set
允许 nat
具有与它量化的完全相同的类型 Set
。如果没有预测性,nat
必须具有比它所量化的更高的宇宙级别,尽管这些级别对您是隐藏的,直到您遇到问题中的错误。
请注意,谓词 Set
是经典逻辑中的 incompatible。
在下面的代码中,语句 add'_commut
被 Coq 接受,但 add_commut
由于全域不一致而被拒绝。
Set Universe Polymorphism.
Definition nat : Type := forall (X : Type), X -> (X -> X) -> X.
Definition succ (n : nat) : nat := fun X z s => s (n X z s).
Definition add' (m n : nat) : nat := fun X z s => m X (n X z s) s.
Definition nat_rec (z : nat) (s : nat -> nat) (n : nat) : nat := n nat z s.
Definition add (m n : nat) : nat := nat_rec n succ m.
Definition equal (A : Type) (a : A) : A -> Type := fun a' => forall (P : A -> Type), P a -> P a'.
Lemma add'_commut (m n : nat) : equal nat (add' m n) (add' n m).
Admitted.
Lemma add_commut (m n : nat) : equal nat (add m n) (add n m).
(*
In environment
m : nat
n : nat
The term "add n (fun X : Type => m X)" has type
"nat@{Top.1078 Top.1079}"
while it is expected to have type
"nat@{Top.1080 Top.1078}" (universe inconsistency).
*)
如何让它通过?
教堂数字只有在您打开祈使句 Set
时才有效,方法是将 -arg -impredicative-set
放入 _CoqProject
文件或使用 -impredicative-set
命令行选项。然后定义nat
为:
Definition nat : Set := forall (X : Set), X -> (X -> X) -> X.
Impredicative Set
允许 nat
具有与它量化的完全相同的类型 Set
。如果没有预测性,nat
必须具有比它所量化的更高的宇宙级别,尽管这些级别对您是隐藏的,直到您遇到问题中的错误。
请注意,谓词 Set
是经典逻辑中的 incompatible。