如果类型类具有Prop,则Coq不会计算类型类函数

时间:2017-01-28 22:07:12

标签: typeclass coq

我无法理解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相关字词,但没有结果。我还尝试用Prop替换Type的实例,但没有结果。

有人可以澄清为什么Coq不会从类型类中计算函数,如果该类型类中有Prop吗?

1 个答案:

答案 0 :(得分:1)

之所以发生这种情况,是因为您已使用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.