如果类型类具有 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

我试过在校对模式下对相关条款使用unfoldcompute,但没有结果。我还尝试用 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.