Coq:使用`PartialOrder`类型类

时间:2017-06-18 01:38:11

标签: typeclass coq

我试图在posets上定义字符串的字典顺序,但我不完全确定如何使用PartialOrder类型类。

Require Import List RelationClasses.

Fail Inductive lex_leq {A : Type} `{po : PartialOrder A} : list A -> list A -> Prop :=
  | lnil: forall l, lex_leq nil l
  | lcons: 
      forall (hd1 hd2 : A) (tl1 tl2 : list A),
        hd1 <= hd2 -> (* error *)
        (hd1 = hd2 -> lex_leq tl1 tl2) -> 
        lex_leq (hd1 :: tl1) (hd2 :: tl2).

部分输出:

The term "hd1" has type "A" while it is expected to have type "nat".

显然<=是在这里使用的错误符号;我想知道如何从po实例中获取排序关系。

1 个答案:

答案 0 :(得分:1)

可以明确地绑定名称以使事情更加明显。在我们能够做到这一点之前,我们需要告诉Coq不要使用Generalizable Variables命令抱怨未绑定的变量:

From Coq Require Import List RelationClasses.

Generalizable Variables A eqA R.

Inductive lex_leq `{PartialOrder A eqA R} : list A -> list A -> Prop :=
  | lnil: forall l, lex_leq nil l
  | lcons: 
      forall (hd1 hd2 : A) (tl1 tl2 : list A),
        R hd1 hd2 ->
        (hd1 = hd2 -> lex_leq tl1 tl2) -> 
        lex_leq (hd1 :: tl1) (hd2 :: tl2).

您可以在手册(here)中找到更多信息。