在Coq中为coinductive类型流定义'head'(没有模式匹配)

时间:2016-11-25 15:43:46

标签: coq coinduction

1)我相信可以使用没有模式匹配的归纳类型。 (仅使用_rec,_rect,_ind)。它不透明,复杂,但可能。 2)是否可以使用coinductive类型的模式匹配?

存在从共同类型到构造函数的共同类型域的并集的函数。 Coq是否明确生成它? 如果是,如何重写'hd'?

Section stream.
  Variable A : Type.

  CoInductive stream : Type :=
  | Cons : A -> stream -> stream.
End stream.

Definition hd A (s : stream A) : A :=
  match s with
    | Cons x _ => x
  end.

1 个答案:

答案 0 :(得分:3)

虽然可以在不直接使用模式匹配的情况下使用归纳类型,但这只是表面上的真实:Coq生成的_rec_rect_ind组合器都是在match的条款。例如:

Print nat_rect.

nat_rect = 
fun (P : nat -> Type) (f : P 0) (f0 : forall n : nat, P n -> P (S n)) =>
fix F (n : nat) : P n :=
  match n as n0 return (P n0) with
  | 0 => f
  | S n0 => f0 n0 (F n0)
  end
     : forall P : nat -> Type,
       P 0 -> (forall n : nat, P n -> P (S n)) -> forall n : nat, P n
此外,在许多情况下,用消除器替换模式匹配将导致具有不同计算行为的术语。考虑以下函数,它将nat除以2:

Fixpoint div2 (n : nat) :=
  match n with
  | 0 | 1 => 0
  | S (S n') => S (div2 n')
  end.

可以使用nat_rec重写此函数,但n - 2上的递归调用使它有点复杂(试试吧!)。

现在,回到你的主要问题,Coq 会自动为共同类型生成类似的消除原则。 Paco库有助于为推理提供有关共感数据的更有用的原则。但据我所知,编写普通函数没有类似内容。

值得指出的是,您提出的方法与Coq对归纳数据类型的做法不同,因为nat_rect和朋友允许通过归纳编写递归函数和证明。提供这些组合器的原因之一是它们被induction策略使用。 nat -> unit + nat类型的东西,或多或少与你提出的东西相对应,是不够的。