2012-12-10 23 views
6

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?

Trả lời

8

Nó chỉ ra rằng chương của CPDT vào chung Recursion giải quyết chỉ là vấn đề cụ thể:

http://adam.chlipala.net/cpdt/html/GeneralRec.html

Đọc phần gọi là Well-thành lập đệ quy, nó thực hiện việc hợp nhất loại sử dụng đệ quy có cơ sở để giúp kiểm tra chấm dứt của Coq được hạnh phúc.

Có thể có nhiều cách khác để giải quyết vấn đề đó bằng cách sử dụng Function hoặc Program Fixpoint, nhưng tôi nghĩ đọc về đệ quy được thiết lập tốt sẽ không làm tổn thương.