定义同类多函数的有效方法

时间:2018-04-01 17:49:06

标签: coq

我想避免复制和粘贴参数并返回我想要定义的相同类型的函数类型。因为在我看来,这将是糟糕的编程实践。

例如,我定义了以下函数:

Definition metric_non_negative {X : Type} (d : X -> X -> R) :=
  forall x y : X, (d x y) >= 0.

Definition metric_identical_arguments {X : Type} (d : X -> X -> R) :=
  forall x y : X, (d x y) = 0 <-> x = y.

我希望能够在不重复输入冗余的情况下定义这两个函数:

{X : Type} (d : X -> X -> R)

我还想潜在地定义第三个函数,在这种情况下,解决方案应该推广到定义了两个以上相同类型的函数的情况。这有可能,怎么样?

1 个答案:

答案 0 :(得分:3)

正如Anton Trunov在评论中提到的,听起来就像你想要使用一个部分:

Section Metric.

  Context {X: Type}.
  Variable (d: X -> X -> nat).

  Definition metric_non_negative :=
    forall x y : X, (d x y) >= 0.

  Definition metric_identical_arguments :=
    forall x y : X, (d x y) = 0 <-> x = y.

End Metric.

请注意,我使用Context使X成为隐式参数;您也可以使用Set Implicit Arguments.并将其设为Variable,让Coq自动设置其隐含性。