Я хотел бы создать зависимую функцию, но я сталкиваюсь с ошибкой несоответствия типов в термине 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").
Стандартный список, когда ему дается набор, становится самим набором, но, похоже, он этого не делает, когда создается псевдоним таким образом. Например:
Check (list nat). (* list nat : Set *)
Check (env nat). (* env nat : Type *)
Есть ли причина этого несоответствия? И есть ли способ обойти это? (Например, могу ли я убедить Coq, что (env nat)
- это Set
? Или я могу использовать более общую функцию False_rec
, которая работает на Type
вместо Set
?)