कार्स्टन König मुक्त प्रमेय उपयोग करने के लिए एक टिप्पणी में सुझाव दिया। आइए कोशिश करें।
प्रधानमंत्री तोप
हम generating the free theorem से शुरू प्रकार (a->a) -> [a] -> Bool
करने के लिए इसी। यह एक संपत्ति है कि उस प्रकार के हर समारोह को प्रसिद्ध वाडलर के पेपर Theorems for free! द्वारा स्थापित किया जाना चाहिए।
forall t1,t2 in TYPES, R in REL(t1,t2).
forall p :: t1 -> t1.
forall q :: t2 -> t2.
(forall (x, y) in R. (p x, q y) in R)
==> (forall (z, v) in lift{[]}(R). f_{t1} p z = f_{t2} q v)
lift{[]}(R)
= {([], [])}
u {(x : xs, y : ys) | ((x, y) in R) && ((xs, ys) in lift{[]}(R))}
एक उदाहरण
बेहतर, ऊपर प्रमेय को समझने के लिए एक ठोस उदाहरण के ऊपर चलने देने के लिए। प्रमेय का उपयोग करने के लिए, हमें किसी भी दो प्रकार t1,t2
लेने की आवश्यकता है, इसलिए हम t1=Bool
और t2=Int
चुन सकते हैं।
फिर हम एक समारोह p :: Bool -> Bool
(माना p=not
), और एक समारोह q :: Int -> Int
(माना q = \x -> 1-x
) का चयन करने की जरूरत है।
अब, हमें R
Bool
एस और Int
एस के बीच संबंध को परिभाषित करने की आवश्यकता है। चलिए मानक बुलियन < -> पूर्णांक पत्राचार, यानी लेते हैं।:
R = {(False,0),(True,1)}
(उपर्युक्त एक-एक पत्राचार है, लेकिन यह सामान्य रूप से होना आवश्यक नहीं है)।
अब हमें (forall (x, y) in R. (p x, q y) in R)
जांचना होगा।
Case (x,y) = (False,0): we verify that (not False, 1-0) = (True, 1) in R (ok!)
Case (x,y) = (True ,1): we verify that (not True , 1-1) = (False,0) in R (ok!)
अब तक तो अच्छा: हम केवल (x,y) in R
की जांच करने के दो मामलों की है। अब सूचियों पर काम करने के लिए हमें संबंध को "उठाना" चाहिए: उदा।
[True,False,False,False] is in relation with [1,0,0,0]
इस विस्तारित संबंध ऊपर lift{[]}(R)
नामित एक है।
अंत में, प्रमेय के अनुसार, के लिए किसी भी समारोह f :: (a->a) -> [a] -> Bool
हम होना आवश्यक है
f_Bool not [True,False,False,False] = f_Int (\x->1-x) [1,0,0,0]
जहां f_Bool
ऊपर बस यह स्पष्ट है कि f
विशेष मामले में प्रयोग किया जाता है बनाता है जो a=Bool
में।
इस की शक्ति यह है कि हम नहीं जानते कि f
का कोड वास्तव में क्या है। हम f
को अपने पॉलीमोर्फिक प्रकार को देखकर संतुष्ट होना चाहिए।
चूंकि हमें प्रकार अनुमान से प्रकार मिलते हैं, और हम प्रकारों को प्रमेय में बदल सकते हैं, हम वास्तव में "मुफ्त में प्रमेय" प्राप्त करते हैं।
मूल लक्ष्य
हम साबित होता है कि f
अपनी पहली तर्क का उपयोग नहीं करता है, और अपने दूसरे सूची तर्क के बारे में परवाह है कि नहीं है, या तो, इसकी लंबाई के अलावा चाहते हैं वापस।
इसके लिए, R
सार्वभौमिक रूप से वास्तविक संबंध बनें। फिर, lift{[]}(R)
एक रिश्ता है जो दो सूचियों से संबंधित है अगर उनके पास समान लंबाई है।
प्रमेय तो अर्थ है:
forall t1,t2 in TYPES.
forall p :: t1 -> t1.
forall q :: t2 -> t2.
forall z :: [t1].
forall v :: [t2].
length z = length v ==> f_{t1} p z = f_{t2} q v
इसलिए, f
पहला तर्क पर ध्यान न देकर केवल एक दूसरे की लंबाई के बारे में परवाह है।
QED
'[]' मान्य प्रकार नहीं है। – MathematicalOrchid
@MathematicalOrchid: धन्यवाद, – false
तय करें, यदि आपने पहले तर्क को अनदेखा किया है और आपके साथ पहले तर्क सहित मैं किसी भी सार्थक संख्या के साथ नहीं आ सकता - समस्या "मुक्त करने के लिए प्रमेय" के लिए कॉल करती है;) – Carsten