मैं कोक के साथ चारों ओर बेवकूफ बना रहा हूँ। विशेष रूप से, मैं विलय को लागू करने की कोशिश कर रहा हूं और फिर साबित करता हूं कि यह काम करता है।कोक में फिक्सपॉइंट की सीमाएं?
एक कार्यान्वयन पर मेरे प्रयास किया गया था:
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 से छोटे हैं?