如果类型类具有 Prop,Coq 将不会计算类型类函数
Coq won't compute a typeclass function if the typeclass has a Prop
我无法理解 Coq 类型类函数的计算(或缺乏)行为。这是一个最小的工作示例:
Class class1 : Set := { class_func1 : nat -> nat }.
Class class2 : Set := { class_func2 : nat -> nat
; class_prop2 : forall x : nat, x = x
}.
Instance class1_instance : class1 := { class_func1 := S }.
Instance class2_instance : class2 := { class_func2 := S }.
Proof.
auto.
Qed.
Compute class_func1 5.
Compute class_func2 5.
当我调用 Compute class_func1 5.
时,Coq 按预期输出 6 : nat
。但是,当我调用 Compute class_func2 5.
时,我得到
= (let (class_func2, _) := class2_instance in class_func2) 5
: nat
我试过在校对模式下对相关条款使用unfold
和compute
,但没有结果。我还尝试用 Type
替换 Prop
的实例,但没有结果。
如果类型类中有 Prop
,有人可以澄清为什么 Coq 不会从类型类计算函数吗?
发生这种情况是因为您使用 Qed
而不是 Defined
来完成 class2_instance
的定义。 Qed
使您的定义不透明,无法进行计算。
以下作品:
Instance class2_instance : class2 := { class_func2 := S }.
Proof. trivial. Defined.
Compute class_func2 5. (* returns 6 *)
这是一个通用的东西,并不是因为 Prop
使用了类型类。例如。身份函数的以下定义也不会计算
Definition id (x : nat) : nat.
exact x. Qed.
我无法理解 Coq 类型类函数的计算(或缺乏)行为。这是一个最小的工作示例:
Class class1 : Set := { class_func1 : nat -> nat }.
Class class2 : Set := { class_func2 : nat -> nat
; class_prop2 : forall x : nat, x = x
}.
Instance class1_instance : class1 := { class_func1 := S }.
Instance class2_instance : class2 := { class_func2 := S }.
Proof.
auto.
Qed.
Compute class_func1 5.
Compute class_func2 5.
当我调用 Compute class_func1 5.
时,Coq 按预期输出 6 : nat
。但是,当我调用 Compute class_func2 5.
时,我得到
= (let (class_func2, _) := class2_instance in class_func2) 5
: nat
我试过在校对模式下对相关条款使用unfold
和compute
,但没有结果。我还尝试用 Type
替换 Prop
的实例,但没有结果。
如果类型类中有 Prop
,有人可以澄清为什么 Coq 不会从类型类计算函数吗?
发生这种情况是因为您使用 Qed
而不是 Defined
来完成 class2_instance
的定义。 Qed
使您的定义不透明,无法进行计算。
以下作品:
Instance class2_instance : class2 := { class_func2 := S }.
Proof. trivial. Defined.
Compute class_func2 5. (* returns 6 *)
这是一个通用的东西,并不是因为 Prop
使用了类型类。例如。身份函数的以下定义也不会计算
Definition id (x : nat) : nat.
exact x. Qed.