2017-01-28 5 views
7

मॉर्ट/कोक के समान भाषा का उपयोग करके, मैं सरल कथन there are lists of arbitrary lengths साबित करने का प्रयास कर रहा हूं।सबूतों पर ईटा-रूपांतरण मुद्दों से बचने के लिए एक बेकार 'आईडी' कॉल में चर को लपेटना सामान्य है?

∀ n:Nat -> 
(ThereIs (List Nat) 
    (Equal Nat 
    (List.length Nat l) 
    n))) 

ThereIs निर्भर जोड़ी (सिग्मा) है: कि के लिए, मैं निम्नलिखित प्रकार लिखा था। सब चर्च-एनकोडेड है। यह साबित करने के लिए, मैं निम्नलिखित सबूत लिखा है:

λ n:Nat -> 
(ThereIs.this (List Nat) 
    (λ l:(List Nat) -> (Equal Nat (List.length Nat l) n)) 
    (List.replicate Nat n Nat.Zero) 
    (Equal.refl Nat n)) 

अजीब तरह से, मैं d के बीच एक प्रकार मेल नहीं खाता त्रुटि मिलती है (अर्थात, प्रकार नेट से मुक्त चर) और λ c:* -> λ b:(c -> c) -> λ a:c -> (d c b a)। लेकिन बाद में यह शब्द, जब ईटा-कम हो गया, केवल d है!

λ n: Nat -> 

λ Nat:* -> 
λ Succ: (Nat -> Nat) -> 
λ Zero: Nat -> 

(n Nat Succ Zero) 

अब, n, मैं "गैर-ईटा" के हर घटना है कि बेकार आईडी लगाने से यह: जब से मैं एक ईटा-कम करने के लिए तैयार नहीं है, मैं बजाय इस निम्नलिखित "बेकार की पहचान" समारोह बना दिया , सबूत जांचने के कारण। मैं यहां क्या हो रहा है की किसी भी प्रकार की अंतर्दृष्टि प्राप्त करना चाहता हूं। क्या यह "बेकार आईडी" लेखन प्रमाणों पर एक ज्ञात/प्रयुक्त पैटर्न है? इस छोटी सी सहायता के बिना इस सबूत को टाइप करने में सक्षम निर्देशों का गणक क्यों नहीं है? क्या इस घटना के पीछे कोई गहरी तर्क है या यह सिर्फ एक विशेष कारण के लिए चीजें कैसे हैं?

+1

आपका मतलब अल्फा नहीं है, है ना? –

+0

हां क्षमा करें @ रीडबर्टन – MaiaVictor

+2

मुझे लगता है कि विशेष रूप से टाइप की गई सभी आईडी की आईडी '- केवल ईटा बराबर नहीं - सबूत सिस्टम में बहुत आम हैं। कोक में आधे रणनीतिएं 'आईडी' में अनुवाद करना एक विशेष रूप से रोमांचक तरीके से लिखी गई हैं। –

उत्तर

4

आपको अपने रूपांतरण जांच एल्गोरिदम में ईटा जोड़ने की आवश्यकता है। यही कारण है कि कई तरह से किया जा सकता है, सबसे सरल दो हैं

  • प्रकार निर्देशित Ulf Norell's thesis के पेज 22 में के रूप में और AGDA में इस्तेमाल
  • untyped रूप Coq AFAIK में इस्तेमाल

untyped ईटा रूपांतरण है कार्यों के लिए पूर्ण, और यह हमारे मामले में टाइप किए गए संस्करण (तटस्थ अनुप्रयोगों में पुन: गणना या कैश प्रकारों की तुलना में) की तुलना में सरल और तेज़ है। एल्गोरिदम इस तरह जाता है:

हम पहले मामले की जांच करते हैं जब दोनों मान सामान्य रूप से लैम्ब्स होते हैं। हालांकि, हम उसके बाद दो अतिरिक्त मामलों की जांच करते हैं, जब केवल एक तरफ लैम्ब्डा होता है। इन मामलों में, हम लैम्बडा बॉडी को एक नए जेनेरिक चर (सामान्य रूप से) पर लागू करते हैं, और उसी शब्द को अन्य शब्द भी लागू करते हैं, और परिणामी मानों की समानता की जांच करते हैं।

यह सब कुछ है! यह वास्तव में बहुत ही सरल है, और इसमें अधिक प्रदर्शन लागत नहीं है। ध्यान दें कि हमें ईटा कमी, या मजबूत ईटा सामान्यीकरण को लागू करने की आवश्यकता नहीं है, क्योंकि ईटी रूपांतरण जांच आसानी से फ्लाई पर कमजोर-सामान्य सामान्य मूल्यों पर की जाती है।

+1

"टाइप किए गए ईटा रूपांतरण केवल इकाई प्रकारों के ईटा रूपांतरण के लिए आवश्यक है" - किसी भी अप्रासंगिक प्रस्तावों में से जो 'बीओटी', '_-> _', 'सिग्मा', प्रस्तावित छंटनी और यहां तक ​​कि उपयोगकर्ता द्वारा परिभाषित 'डेटा' (' रिकॉर्ड' के विपरीत) शामिल हो सकता है, उदाहरण के लिए आपके पास एक प्रणाली हो सकती है जहां आप साबित कर सकते हैं कि 'एसी' एक 'प्रो' है यदि 'ए' 'प्रो' है (जो काम करता है, क्योंकि 'वेक ए एन कंटेनर का आकार' टॉप 'है, यानी सांख्यिकीय रूप से ज्ञात है, तो आगे सामान्यीकरण के लिए गुंजाइश है (प्रस्तावक आकार और पदों के साथ कोई कंटेनर, मुझे लगता है?)) और इस ज्ञान के साथ एकीकरण को दोबारा सुधारें। – user3237465

+0

@ user3237465 वे आधुनिक डिप्टी के संदर्भ में भी उन्नत सुविधाएं हैं। भाषाएं, इसलिए मैंने उन्हें प्रश्न के दायरे से बाहर सोचा। 'Prop

+0

@ user3237465 इसके अलावा, मुझे लगता है कि प्रस्तावना छंटनी एक अलग लीग में है। एकीकरण परंपरागत रूप से केवल समान समानता तक समीकरण हल करता है, जो सबूत अप्रासंगिक है, लेकिन यदि हम उच्च रचनाकारों को समाधान के रूप में देखते हैं, तो हमें सबूत प्रासंगिक एकीकरण की आवश्यकता है। Agda में, पैटर्न में एकीकरण के लिए उचित '--without-K' काफी जटिल था [जटिलता कूद] (https://people.cs.kuleuven.be/~jesper.cockx/unifiers-as-equivalences/draft.pdf) , और मुझे लगता है कि दाएं हाथ के पक्षों/implicits पर एकीकरण के लिए यह आसान नहीं होगा। –

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