使用False_rec在Coq

时间:2018-08-24 16:21:12

标签: coq

我想创建一个依赖函数,但是在False_rec术语上遇到类型不匹配错误。我正在尝试执行以下操作:

Definition env A := list A.

Fixpoint zip (xs ys : env nat) (H : length xs = length ys) : env (nat * nat).
Proof.
  refine
  (match xs, ys with
  | [], [] => []
  | x :: xs, y :: ys =>
      (x, y) :: zip xs ys _
  | _, _ => False_rec _ _
  end).
...

但是,我收到以下错误:

The term "False_rec ?P ?f" has type "?P" while it is expected to have type 
"env (nat * nat)" (unable to find a well-typed instantiation for 
"?P": cannot ensure that "Type" is a subtype of "Set").

当标准列表被赋予Set时,它本身就是一个set,但是当以这种方式进行别名时,它似乎并没有这样做。例如:

Check (list nat). (* list nat : Set *)
Check (env nat). (* env nat : Type *)

是否存在这种不匹配的原因?有办法解决吗? (例如,我可以说服Coq (env nat)Set吗?还是可以使用在False_rec而不是Type上运行的更通用的Set函数?)

1 个答案:

答案 0 :(得分:2)

  

是否存在这种不匹配的原因?

是的。 Type是一个实体,可以包含Set不适合的(大)事物。例如。 nat适合Set,但Set不适合自身。我认为应该有不止一个出色的答案来解释这个问题。

  

(例如,我可以说服Coq (env nat)Set吗?

您可以使用显式类型注释:

Definition env (A : Set) : Set := list A.
  

还是可以使用在False_rec而不是Type上运行的更通用的Set函数?

是的,可以。称为False_rect

请注意,简单的match表达式在您的情况下不起作用(无论Set / Type业务如何),您都需要使用依赖模式匹配。另一种可能性是使用证明模式来定义您的功能。