क्या काम करता है
यदि आप पेड़ों पर निर्धारण की परिभाषा के अंदर सूचियों पर तय बिंदु की परिभाषा देते हैं, तो परिणाम अच्छी तरह से टाइप किया जाता है। यह एक सामान्य सिद्धांत है जब आपने एक प्रेरक प्रकार में पुनरावर्ती नामकरण किया है, अर्थात जब पुनरावर्तन जैसे निर्माणकर्ता के माध्यम से जाता है list
।
Fixpoint size (t : LTree) : nat :=
let size_l := (fix size_l (l : list LTree) : nat :=
match l with
| nil => 0
| h::r => size h + size_l r
end) in
match t with Node l =>
1 + size_l l
end.
या यदि आप इसे और अधिक लिखना पसंद करते हैं:
Fixpoint size (t : LTree) : nat :=
match t with Node l =>
1 + (fix size_l (l : list LTree) : nat :=
match l with
| nil => 0
| h::r => size h + size_l r
end) l
end.
(मुझे नहीं पता कि मैंने इसे पहले किस से सुना था; यह निश्चित रूप से कई बार स्वतंत्र रूप से खोजा गया था।)
एक सामान्य पुनरावृत्ति विधेय
आम तौर पर, आप LTree
मैन्युअल रूप से "उचित" इंडक्शन सिद्धांत को परिभाषित कर सकते हैं । स्वचालित रूप से उत्पन्न प्रेरण सिद्धांत LTree_rect
सूची पर परिकल्पना को छोड़ देता है, क्योंकि प्रेरण सिद्धांत जनरेटर केवल गैर-नेस्टेड को प्रेरक प्रकार के सख्ती से सकारात्मक घटनाओं को समझता है।
LTree_rect =
fun (P : LTree -> Type) (f : forall l : list LTree, P (Node l)) (l : LTree) =>
match l as l0 return (P l0) with
| Node x => f x
end
: forall P : LTree -> Type,
(forall l : list LTree, P (Node l)) -> forall l : LTree, P l
आइए सूचियों पर इंडक्शन परिकल्पना जोड़ें। पुनरावर्ती कॉल में इसे पूरा करने के लिए, हम सूची प्रेरण सिद्धांत कहते हैं और इसे सूची के अंदर छोटे पेड़ पर पेड़ प्रेरण सिद्धांत पास करते हैं।
Fixpoint LTree_rect_nest (P : LTree -> Type) (Q : list LTree -> Type)
(f : forall l, Q l -> P (Node l))
(g : Q nil) (h : forall t l, P t -> Q l -> Q (cons t l))
(t : LTree) :=
match t as t0 return (P t0) with
| Node l => f l (list_rect Q g (fun u r => h u r (LTree_rect_nest P Q f g h u)) l)
end.
क्यों
पुनरावर्ती कार्यों को स्वीकार करने के लिए सटीक नियमों में क्यों निहित है इसका जवाब। ये नियम सूक्ष्म रूप से लागू होते हैं, क्योंकि जटिल मामलों की अनुमति देने के बीच एक नाजुक संतुलन होता है (जैसे कि यह एक, डेटाटाइप में नेस्टेड पुनरावृत्ति के साथ) और निराधारता। Coq संदर्भ मैनुअल द्वारा प्रस्तुत भाषा (आगमनात्मक निर्माणों की पथरी, जो Coq का सबूत भाषा है), ज्यादातर औपचारिक रूप से सटीक परिभाषा के साथ है, लेकिन आप प्रेरण और coinduction आप की जरूरत शोध पत्र पर पहुंच जाएंगे के बारे में सटीक नियम चाहते हैं, इस विषय पर एडुआर्डो गिमनेज़ [1]।
कोक मैनुअल के साथ शुरू, Fix
नियम के अंकन में , हमारे पास की फिक्सपॉइंट परिभाषा हैF i x चमैं{ च1: ए1: = टी1;च2: ए2: = टी2}
Γ1Γ2= ( x : L T r e e )= ( l : l i s tL T r e e )ए1ए2= एन ए टी= एन ए टीटी1टी2= ग एक रों ई ( एक्स , एल टी आर ई ई , λ y। जी1( च2y) )= ग एक रों ई ( एल , एल मैं एस टीएल टी आर ई ई ,λएचआर । जी2( च1ज ) ( च2र ) )
चजेटीमैंचमैं
- मैं = १ज = २
l
t
size
- मैं = २ज = १
h
l
size_l
- मैं = २ज = २
r
l
size_l
Coq दुभाषिया के अनुसार h
संरचनात्मक रूप से छोटा क्यों नहीं है इसका कारण l
मेरे लिए स्पष्ट नहीं है। जहां तक मैं कोक्-क्लब की सूची [1] [2] पर चर्चा से समझता हूं, यह दुभाषिया में एक प्रतिबंध है, जिसे सिद्धांत रूप में उठाया जा सकता है, लेकिन एक असंगति को पेश करने से बचने के लिए बहुत सावधानी से।
संदर्भ
कोकोरिको, नॉनटार्मिंग कोक विकी: म्यूचुअल इंडक्शन
कोक-क्लब मेलिंग सूची:
द कोक डेवलपमेंट टीम। द कॉक प्रूफ असिस्टेंट: रेफरेंस मैनुअल । संस्करण 8.3 (2010)। [ वेब ] ch। ४ ।
एडुआर्डो जिमनेज़। पुनरावर्ती योजनाओं के साथ संरक्षक परिभाषाओं को संहिताबद्ध करना । में Types'94: सबूत और कार्यक्रम के लिए प्रकार , LNCS 996. स्प्रिंगर-वर्लग, 1994 डीओआई: 10.1007 / 3-540-60579-7_3 [ स्प्रिंगर ]
एडुआर्डो जिमनेज़। टाइप थ्योरी में संरचनात्मक पुनरावर्ती परिभाषाएँ । में ICALP'98: 25 वीं ऑटोमेटा, बोली और प्रोग्रामिंग पर अंतर्राष्ट्रीय वार्तालाप की कार्यवाही। स्प्रिंगर-वर्लग, 1998. [ PDF ]