我在玩 Coq。具体来说,我正在尝试实现合并排序,然后证明它有效。
我的实现尝试是:
Fixpoint sort ls :=
match ls with
| nil => nil
| cons x nil => cons x nil
| xs =>
let (left, right) := split xs nil nil
in merge (sort left) (sort right)
end.
因此,我得到的错误是:
Error:
Recursive definition of sort is ill-formed.
In environment
sort : list nat -> list nat
ls : list nat
x : nat
l : list nat
y : nat
l0 : list nat
left : list nat
right : list nat
Recursive call to sort has principal argument equal to "left" instead of
one of the following variables: "l" "l0".
Recursive definition is:
"fun ls : list nat =>
match ls with
| nil => nil
| x :: nil => x :: nil
| x :: _ :: _ =>
let (left, right) := split ls nil nil in merge (sort left) (sort right)
end".
我对这些错误的解释是 l 和 l0 是没有头部的 ls、x 和没有 x 的 ls 以及 x 之后的元素(我猜它决定称为 y?)。我没有在这些列表之一上递归而是在本地定义的列表上递归,这很疯狂。
我是否只允许递归直接来自模式匹配的事物?如果是,这似乎是一个严重的限制。有没有办法解决它?我猜 Coq 无法判断该函数将终止。有什么方法可以证明左右都小于 xs 吗?