2015-05-12 11 views
6

में टुपल के लिए लेट-डिस्ट्रक्ट का उपयोग करने में विफलता मैं Coq के लिए एक नया उपयोगकर्ता हूं। मैंने कुछ कार्यों को परिभाषित किया है:कोक

Definition p (a : nat) := (a + 1, a + 2, a + 3). 

Definition q := 
let (s, r, t) := p 1 in 
s + r + t. 

Definition q' := 
match p 1 with 
| (s, r, t) => s + r + t 
end. 

मैं पी के परिणाम को टुपल प्रतिनिधित्व में नष्ट करने की कोशिश कर रहा हूं। हालांकि coqc q पर शिकायत करता है:

Error: Destructing let on this type expects 2 variables. 

जबकि q 'संकलन पास कर सकता है। यदि मैं एक जोड़ी (ए + 1, ए + 2) वापस करने के लिए पी बदलता हूं, तो संबंधित क्यू और क्यू 'दोनों ठीक काम करते हैं।

क्यों चलो विनाश केवल जोड़ी की अनुमति देता है? या मैंने वाक्यविन्यास में कोई त्रुटि की है? मैंने कोक मैनुअल के साथ जांच की है लेकिन कोई सुराग नहीं मिला है।

धन्यवाद!

उत्तर

8

कोक में थोड़ा उलझन में यह है कि दो नष्ट करने के विभिन्न रूप हैं। एक आप पैटर्न से पहले एक उद्धरण की जरूरत के लिए देख रहे हैं:

Definition p (a : nat) := (a + 1, a + 2, a + 3). 

Definition q := 
    let '(s, r, t) := p 1 in 
    s + r + t. 

एक उद्धरण के साथ पैटर्न लगाकर आप उन्हें में नेस्टेड पैटर्न और उपयोग उपयोगकर्ता परिभाषित अंकन उपयोग करने के लिए अनुमति देता है। उद्धरण के बिना फॉर्म केवल एक-स्तर के पैटर्न के साथ काम करता है, और आपको नोटेशन का उपयोग करने की अनुमति नहीं देता है, या आपके पैटर्न में कन्स्ट्रक्टर नामों का संदर्भ नहीं देता है।

+2

धन्यवाद! तो 3 सदस्यीय ट्यूपल को जोड़ी के पहले सदस्य पर फिर से नष्ट करने के रूप में माना जाना चाहिए, तो मुझे 'उद्धरण' का उपयोग करना होगा? – xywang

+0

हाँ, यही वह है! –

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