2012-12-10 16 views
6

मैं कोक के साथ चारों ओर बेवकूफ बना रहा हूँ। विशेष रूप से, मैं विलय को लागू करने की कोशिश कर रहा हूं और फिर साबित करता हूं कि यह काम करता है।कोक में फिक्सपॉइंट की सीमाएं?

एक कार्यान्वयन पर मेरे प्रयास किया गया था:

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". 

इन त्रुटियों के मेरे व्याख्या यह है कि एल और l0 बिना ls हैं एक्स के बिना इसके सिर, एक्स, और एलएस और x के बाद तत्व (जो मुझे लगता है कि यह वाई कॉल करने का फैसला किया है?)। यह पागल है कि मैंने इन सूचियों में से किसी एक पर भर्ती नहीं की और इसके बजाय स्थानीय रूप से परिभाषित सूची पर पुन: शापित किया।

क्या मुझे केवल उन चीज़ों पर पुनर्विचार करने की इजाजत है जो सीधे पैटर्न मिलान से आती हैं? यदि हां, तो यह एक गंभीर सीमा की तरह लगता है। क्या इसके आसपास के तरीके हैं? मैं अनुमान लगा रहा हूं कि कोक यह नहीं बता सकता कि समारोह समाप्त हो जाएगा। क्या यह साबित करने का कोई तरीका है कि बाएं और दाएं xs से छोटे हैं?

उत्तर

8

ऐसा लगता है कि जनरल Recursion पर CPDT के अध्याय केवल उस विशेष मुद्दे को संबोधित:

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

अनुभाग अच्छी जगह स्थापित किया गया प्रत्यावर्तन बुलाया पढ़ें, यह मर्ज तरह से अच्छी तरह से स्थापित किया गया प्रत्यावर्तन का उपयोग कर लागू करता है कोक के समापन परीक्षक को खुश होने में सहायता करें।

Function या Program Fixpoint का उपयोग करके उस समस्या को हल करने के अन्य तरीके हो सकते हैं, लेकिन मुझे लगता है कि अच्छी तरह से स्थापित रिकर्सन के बारे में पढ़ने से कोई दिक्कत नहीं होगी।

संबंधित मुद्दे