我想创建一个依赖函数,但是在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
函数?)
答案 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
业务如何),您都需要使用依赖模式匹配。另一种可能性是使用证明模式来定义您的功能。