2012-02-05 20 views
6

मैं संरचनात्मक प्रेरण का उपयोग करके परिभाषित कार्यों को स्वीकार करने के लिए आगाडा के समापन परीक्षक नहीं प्राप्त कर सकता।संरचनात्मक प्रेरण की समाप्ति

मैंने इस समस्या को प्रदर्शित करने के सबसे सरल उदाहरण के रूप में निम्न को बनाया है। size की निम्न परिभाषा को अस्वीकार कर दिया गया है, भले ही यह हमेशा सख्ती से छोटे घटकों पर पुनरावृत्ति करता है।

module Tree where 

open import Data.Nat 
open import Data.List 

data Tree : Set where 
    leaf : Tree 
    branch : (ts : List Tree) → Tree 

size : Tree → ℕ 
size leaf = 1 
size (branch ts) = suc (sum (map size ts)) 

क्या इस समस्या का कोई सामान्य समाधान है? क्या मुझे अपने डेटा प्रकार के लिए Recursor बनाने की आवश्यकता है? यदि हां, तो मैं यह कैसे कर सकता हूं? मैन्युअल रूप से इनलाइन कर सकते हैं और नक्शे और योग की परिभाषा फ्यूज: (मुझे लगता है कि वहाँ एक List A के लिए एक Recursor कैसे परिभाषित करेंगे, इसका एक उदाहरण है, कि मुझे पर्याप्त संकेत देना होगा?)

उत्तर

7

वहाँ एक चाल आप यहाँ कर सकते है एक आपसी ब्लॉक के अंदर। यह बहुत ही विरोधी मॉड्यूलर है, लेकिन यह सबसे आसान तरीका है जिसे मैं जानता हूं। कुछ अन्य कुल भाषाएं (Coq) कभी-कभी इसे स्वचालित रूप से कर सकती हैं।

mutual 
    size : Tree → ℕ 
    size leaf = 1 
    size (branch ts) = suc (sizeBranch ts) 

    sizeBranch : List Tree → ℕ 
    sizeBranch [] = 0 
    sizeBranch (x :: xs) = size x + sizeBranch xs 
+1

हां इस प्रकार मैं 'मानचित्र' का उपयोग करते समय भी ऐसा करता हूं। वास्तव में यह वास्तव में दुर्भाग्यपूर्ण है कि समापन परीक्षक 'मानचित्र' की परिभाषा में नहीं जा सकता है और देख सकता है कि सब कुछ ठीक है। – danr

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