类型类实例中的Fixpoint函数

时间:2017-06-19 01:51:44

标签: typeclass coq

我试图在类型类实例的上下文中使用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"

为了使这项工作,我们需要做些什么?

1 个答案:

答案 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.进行验证。