我试图在类型类实例的上下文中使用fixpoint样式函数,但它似乎不起作用。有什么额外的东西我必须做才能使这项工作?目前我已经使用了将类型类外部的函数移动并明确声明为Fixpoint的hack。然而,这似乎很糟糕。
这是一个简短的例子:
Inductive cexp : Type :=
| CAnd : cexp -> cexp -> cexp
| COr : cexp -> cexp -> cexp
| CProp : bool -> cexp.
Class Propable ( A : Type ) := { compile : A -> Prop }.
Instance: Propable cexp :=
{ compile c :=
match c with
| CAnd x y => (compile x) /\ (compile y)
| COr x y => (compile x) \/ (compile y)
| CProp _ => False
end
}.
这失败了:
Error: Unable to satisfy the following constraints:
In environment:
c, x, y : cexp
?Propable : "Propable cexp"
为了使这项工作,我们需要做些什么?
答案 0 :(得分:2)
您可以使用fix
来执行此操作:
Instance: Propable cexp :=
{ compile := fix compile c :=
match c with
| CAnd x y => (compile x) /\ (compile y)
| COr x y => (compile x) \/ (compile y)
| CProp _ => False
end
}.
让我举例说明如何才能想出来。让我们采取以下代码:
Fixpoint silly n :=
match n with
| 0 => 0
| S n => silly n
end.
Fixpoint
这是一个白话命令,它使眼睛的定义更容易,但它隐藏了这里发生的事情。事实证明,Coq实际上做的是这样的:
Definition silly' :=
fix self n :=
match n with
| 0 => 0
| S n => self n
end.
您可以在定义后使用Print silly.
进行验证。