Tôi đang lừa xung quanh với Coq. Cụ thể, tôi đang cố gắng thực hiện hợp nhất và sau đó chứng minh rằng nó hoạt động.Hạn chế của Fixpoint trong Coq?
nỗ lực của tôi tại một thực hiện là:
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.
Các lỗi mà tôi nhận được là kết quả của việc này là:
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".
giải thích của tôi về các lỗi này là l và l0 là ls mà không đầu của nó, x, và ls mà không có x và phần tử sau x (mà tôi đoán nó quyết định gọi y?). Thật điên rồ khi tôi không tái xét một trong những danh sách này và thay vào đó được đệ trình lại trên danh sách được xác định tại địa phương.
Tôi chỉ được phép chấp nhận những thứ đến trực tiếp từ kết hợp mẫu không? Nếu có, điều này có vẻ như là một hạn chế nghiêm trọng. Có cách nào xung quanh nó không? Tôi đoán Coq không thể nói rằng chức năng sẽ chấm dứt. Có cách nào để chứng minh rằng trái và phải nhỏ hơn xs?