我无法理解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
相关字词,但没有结果。我还尝试用Prop
替换Type
的实例,但没有结果。
有人可以澄清为什么Coq不会从类型类中计算函数,如果该类型类中有Prop
吗?
答案 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.