Coq指数关系

时间:2017-11-30 02:53:58

标签: coq dependent-type

我在Coq中定义索引归纳类型:

Module Typ.

  (* My index -- a t is a `t H` or a `t Z`. *)
  Inductive hz : Set := H | Z .

  (* I'd like to use this relation to constrain Cursor and Arrow. *)
  (* E.g. one specialized Cursor has type `t H -> t Z -> t Z` *)
  Inductive maxHZ : hz -> hz -> hz -> Type :=
  | HZ : maxHZ H Z Z
  | ZH : maxHZ Z H Z
  | HH : maxHZ H H H
  .

  Inductive t : hz -> Type := 
  | Num : t H
  | Hole : t H
  | Cursor : t H -> t Z
  | Arrow : forall a b c, t a -> t b -> t c
  | Sum   : forall a b c, t a -> t b -> t c
  .
End Typ.

如何将Arrow / Sum索引限制为与maxHZ关系相同的形状(缺少创建更多构造函数,如ArrowHZ : t H -> t Z -> t Z)。

1 个答案:

答案 0 :(得分:2)

一种方法:

(* Bring the coercion is_true into scope *)
From Coq Require Import ssreflect ssrfun ssrbool.

Module Typ.

  (* My index -- a t is a `t H` or a `t Z`. *)
  Inductive hz : Set := H | Z .

  (* I'd like to use this relation to constrain Cursor and Arrow. *)
  (* E.g. one specialized Cursor has type `t H -> t Z -> t Z` *)
  Definition maxHZ (x y z : hz) : bool :=
    match x, y, z with
    | H, Z, Z
    | Z, H, Z
    | H, H, H => true
    | _, _, _ => false
    end.

  Inductive t : hz -> Type :=
  | Num  : t H
  | Hole : t H
  | Cursor : t H -> t Z
  | Arrow : forall a b c, maxHZ a b c -> t a -> t b -> t c
  | Sum   : forall a b c, maxHZ a b c -> t a -> t b -> t c
  .
End Typ.

另一个:

  Inductive t : hz -> Type :=
  | Num  : t H
  | Hole : t H
  | Cursor : t H -> t Z
  | Arrow : forall a b c, t a -> t b -> t c
  | Sum   : forall a b c, t a -> t b -> t c
  .

  Definition t_wf x (m : t x) : bool :=
    match m with
    | Arrow a b c _ _ => maxHZ a b c
    | Sum   a b c _ _ => maxHZ a b c
    | _ => true
    end.

  Definition t' x := { m : t x | t_wf x m }.
  (* This is automatically a subtype. *)