在定义中使用多态函数

时间:2018-11-22 19:52:19

标签: coq

在我的问题here之后,我有几个函数具有不同的参数类型,并在其上定义了归纳类型formula。无论如何在Inductive formula中使用compute_formula。我这样做是通过减少必须在证明中处理的构造函数的数量来简化证明。谢谢。

Fixpoint add (n:type1) (m:type2): type3 :=
  match n with
     (*body for add*)
  end.

Fixpoint mul (n:type1) (m:type4): type5 :=
  match n with
   (*body for mul*)
  end.

Inductive formula : Type :=
| Formula {A B}: type1-> A -> (type1->A->B) -> formula.

(* How should I write this *)
Definition compute_formula {A B} (f: formula) (extraArg:A) : B :=
 match f with
  |Formula {A B} part1 part2  part3=>  
        if (A isof type2 && B isof type3) then add part1 part2+extraArg
        if (A isof type4 && B isof type5) then mul part1 part2+extraArg     

  end.

1 个答案:

答案 0 :(得分:2)

您希望compute_formula的输出类型是什么?编写签名的方式,无论B是什么,函数都必须能够计算B的元素。由于这显然是不可能的(BEmpty会怎样?),我将向您展示另一种方法。

想法是使用formula来获取输出类型。

Definition output_type (f: formula) :=
  match f with
  | @Formula _ B _ _ _ => B
  end.

然后我们可以将compute_formula定义为

Definition compute_formula (f: formula): output_type f :=
  match f with
  | @Formula _ _ t a func => func t a
  end.

其他一些事情。我不确定您对extraArg的意思。如果您对这意味着什么更具体,我也许可以为您提供帮助。另外,{(至少在战术之外)没有一种方法可以A isof type2来完成您想要的事情。