Prolog Language ट्यूटोरियल
प्रोलॉग भाषा के साथ शुरुआत करना
खोज…
टिप्पणियों
क्रियान्वयन
- SWI-Prolog (मुक्त) swi-prolog
- SICStus (वाणिज्यिक) sicstus-prolog
- YAP (मुक्त) याप
- ग्नू प्रोलॉग (मुक्त) ग्नू-प्रोलॉग
- XSB (मुक्त) xsb
- बी (वाणिज्यिक) बी-प्रोलॉग
- यदि (वाणिज्यिक)
- Ciao (मुक्त)
- मिनर्वा (वाणिज्यिक)
- ECLiPSe-CLP (मुक्त) ग्रहण-क्लैप
- जेकजेके प्रोलोग (वाणिज्यिक)
- प्रस्तावना IV
- उपज प्रस्ताव (मुक्त)
- सी # , जावास्क्रिप्ट और फाइटन में लागू किया गया
- दृश्य प्रोलॉग (वाणिज्यिक) दृश्य-प्रोलॉग
स्थापना या सेटअप
SWI-Prolog
विंडोज और मैक:
- आधिकारिक वेबसाइट पर SWI-Prolog डाउनलोड करें
- बस इंस्टॉलर निर्देशों का पालन करके स्थापित करें।
लिनक्स (पीपीए):
अपने सिस्टम के सॉफ्टवेयर स्रोतों में PPA
ppa:swi-prolog/stable
जोड़ें (डेवलपर्सppa:swi-prolog/devel
लिए चुन सकते हैंppa:swi-prolog/devel
):एक टर्मिनल खोलें (Ctrl + Alt + T) और टाइप करें:
sudo add-apt-repository ppa:swi-prolog/stable
बाद में, पैकेज की जानकारी को अपडेट करें:
sudo apt-get update
अब पैकेज मैनेजर के माध्यम से SWI-Prolog स्थापित करें:
sudo apt-get install swi-prolog
अब आप कमांड
swipl
साथ कमांड-लाइन के माध्यम से SWI-Prolog शुरू कर सकते हैं
संलग्न / 3
append([], Bs, Bs).
append([A|As], Bs, [A|Cs]) :-
append(As, Bs, Cs).
append/3
सबसे प्रसिद्ध प्रोलॉग संबंधों में से एक है। यह तीन तर्कों के बीच एक संबंध को परिभाषित करता है और यह सच है अगर तीसरा तर्क एक सूची है जो पहले और दूसरे तर्कों में निर्दिष्ट सूचियों के संघटन को दर्शाता है।
विशेष रूप से, और जैसा कि अच्छे Prolog कोड के लिए विशिष्ट है, append/3
का उपयोग कई दिशाओं में किया जा सकता है: इसका उपयोग इसके लिए किया जा सकता है:
संलग्न दो पूरी तरह या आंशिक instantiated सूचियां:
?- A = [1, 2, 3], B=[4, 5, 6], append(A, B, Y) Output: A = [1, 2, 3], B = [4, 5, 6], Y = [1, 2, 3, 4, 5, 6].
जांचें कि क्या संबंध तीन पूरी तरह से त्वरित सूचियों के लिए सही है:
?- A = [1, 2, 3], B = [4, 5], C = [1, 2, 3, 4, 5, 6], append(A, B, C) Output: false
दिए गए सूची में दो सूचियों को जोड़ने के लिए सभी संभव तरीके उत्पन्न करते हैं :
?- append(A, B, [1, 2, 3, 4]). Output: A = [], B = [1, 2, 3, 4] ; A = [1], B = [2, 3, 4] ; A = [1, 2], B = [3, 4] ; A = [1, 2, 3], B = [4] ; A = [1, 2, 3, 4], B = [] ; false.
सीएलपी (एफडी) बाधाओं
सीएलपी (एफडी) बाधाओं को सभी गंभीर प्रोलॉग कार्यान्वयन द्वारा प्रदान किया जाता है। वे हमें शुद्ध तरीके से पूर्णांकों के बारे में तर्क करने की अनुमति देते हैं।
?- X #= 1 + 2.
X = 3.
?- 5 #= Y + 2.
Y = 3.
डेटाबेस प्रोग्रामिंग
प्रस्तावना में सब कुछ वर्गीकृत है:
- परमाणु - पात्रों का कोई भी क्रम जो एक बड़े अक्षर से शुरू नहीं होता है। जैसे -
a
,b
,okay
- संख्याएँ - संख्याओं के लिए कोई विशेष वाक्यविन्यास नहीं है, किसी भी घोषणा की आवश्यकता नहीं है। जैसे
1
,22
,35.8
- चर - एक स्ट्रिंग जो एक बड़े अक्षर या अंडरस्कोर (
_
) से शुरू होती है। जैसेX
,Y
,Abc
,AA
- जटिल शर्तें - वे एक फ़नकार और तर्कों के अनुक्रम से बनाई गई हैं। एक जटिल शब्द का नाम हमेशा एक परमाणु होता है, जबकि तर्क या तो परमाणु या चर हो सकते हैं। जैसे
father(john,doe)
,relative(a)
,mother(X,Y)
।
एक तर्क डेटाबेस में तथ्यों और नियमों का एक सेट होता है ।
तर्कों के रूप में केवल परमाणुओं के साथ एक जटिल शब्द को एक तथ्य कहा जाता है, जबकि तर्क के रूप में चर के साथ एक जटिल शब्द को एक नियम कहा जाता है।
प्रोलोग में तथ्यों का उदाहरण:
father_child(fred, susan).
mother_child(hillary, joe).
प्रोलॉग में एक नियम का उदाहरण:
child_of(X,Y):-
father_child(Y,X)
;
mother_child(Y,X).
ध्यान दें कि ;
यहाँ अन्य भाषाओं में or
ऑपरेटर की तरह है।
प्रस्तावना एक घोषित भाषा है और आप इस डेटाबेस को निम्नानुसार पढ़ सकते हैं:
fred susan का पिता है
हिलेरी जो की मां हैं।
सभी के लिए
X
औरY
,X
का एक बच्चा हैY
अगरY
के पिता हैX
याY
की माँ हैX
।
वास्तव में, तथ्यों और नियमों का एक निश्चित सेट एक लॉजिक प्रोग्राम के रूप में बनता है।
इस तरह के कार्यक्रम का उपयोग प्रश्नों को करके किया जाता है। क्वेरी आपको लॉजिक प्रोग्राम से जानकारी प्राप्त करने की सुविधा देती है।
डेटाबेस को इंटरप्रेटर में लोड करने के लिए (यह मान कर कि आपने डेटाबेस को उस निर्देशिका में सहेजा है, जिसमें आप इंटरप्रेटर चला रहे हैं) बस इस प्रकार है:
?- [nameofdatabase].
वास्तविक फ़ाइल नाम के साथ nameofdatabase
को प्रतिस्थापित करें (ध्यान दें कि यहां हम .pl
एक्सटेंशन को फ़ाइल नाम से बाहर करते हैं)।
उपरोक्त कार्यक्रम और परिणामों के लिए दुभाषिया में प्रश्नों का उदाहरण:
?- child_of(susan,fred).
true
?- child_of(joe,hillary).
true
?- child_of(fred,susan).
false
?- child_of(susan,hillary).
false
?- child_of(susan,X).
X = fred
?- child_of(X,Y).
X = susan,
Y = fred ;
X = joe,
Y = hillary.
उपरोक्त प्रश्नों और उनके उत्तरों को निम्नानुसार पढ़ा जा सकता है:
क्या सुसान फ्रेड का बच्चा है? - सच
क्या बच्चा हिलेरी का बच्चा है? - सच
सुसान का बच्चा पैदा हुआ है? - असत्य
क्या सुसान हिलेरी का बच्चा है? - असत्य
सुसान किसका बच्चा है? - झगड़ा हुआ
यह है कि हम प्रोलॉग में कैसे तर्क देते हैं। एक तर्क कार्यक्रम अधिक औपचारिक रूप से होता है: वस्तुओं के बीच संबंधों (उर्फ भविष्यवाणी) को परिभाषित करते हुए स्वयंसिद्ध या नियमों का एक सेट। एक और अधिक औपचारिक तर्क तरीके से ऊपर डेटाबेस की व्याख्या करने का एक वैकल्पिक तरीका है:
संबंध
father_child
बीच का संबंध फ्रेड और सुसान है
mother_child
का संबंध हिलेरी और जो के बीच है
सभी
X
औरY
के बीच संबंध के लिएchild_of
X
औरY
बीच संबंध रखता है यदि संबंधfather_child
Y
औरX
बीच रखता है, या संबंधmother_child
Y
औरX
बीच रखती है।
नमस्ते दुनिया
नमस्कार, इंटरएक्टिव दुभाषिया में विश्व
"हैलो, वर्ल्ड!" प्रोलोग दुभाषिया में (यहाँ हम swipl
का उपयोग कर रहे हैं, SWI swipl
के लिए शेल):
$ swipl
<...banner...>
?- write('Hello, World!'), nl.
?-
सिस्टम प्रॉम्प्ट है: यह इंगित करता है कि सिस्टम उपयोगकर्ता के लिए लक्ष्यों के अनुक्रम (यानी एक क्वेरी ) दर्ज करने के लिए तैयार है जिसे एक के साथ समाप्त किया जाना चाहिए .
(पूर्ण विराम)।
यहाँ क्वेरी write('Hello World!'), nl
के दो लक्ष्य हैं:
-
write('Hello World!')
:'Hello World!'
प्रदर्शित किया जाना है और (,
) - एक नई लाइन (
nl
) का पालन करना चाहिए।
write/1
( /1
का उपयोग यह इंगित करने के लिए किया जाता है कि विधेय एक तर्क लेता है) और nl/0
अंतर्निर्मित विधेयकों में होता है (परिभाषा प्रोलोग सिस्टम द्वारा अग्रिम में प्रदान की गई है)। अंतर्निहित विधेय सुविधाएं वे सुविधाएं प्रदान करती हैं जो शुद्ध प्रोलॉग परिभाषा द्वारा प्राप्त नहीं की जा सकती हैं या प्रोग्रामर को उन्हें परिभाषित करने से बचाने के लिए।
उत्पादन:
नमस्ते दुनिया!
हाँ
yes
जिसका अर्थ है कि क्वेरी सफल हो गई है के साथ समाप्त होती है। कुछ प्रणालियों में yes
बजाय true
मुद्रित होता है।
नमस्ते, एक फ़ाइल से विश्व
hello_world.pl
नामक एक नई फ़ाइल खोलें और निम्नलिखित पाठ डालें:
:- initialization hello_world, halt.
hello_world :-
write('Hello, World!'), nl.
initialization
निर्देश निर्दिष्ट करता है कि लक्ष्य hello_world, halt
को फ़ाइल लोड होने पर कहा जाना चाहिए। halt
कार्यक्रम से बाहर निकलता है।
यह फ़ाइल तब आपके Prolog द्वारा निष्पादित की जा सकती है। सटीक झंडे प्रोलॉग सिस्टम पर निर्भर करते हैं। यदि आप SWI प्रोलॉग का उपयोग कर रहे हैं:
$ swipl -q -l hello_world.pl
यह आउटपुट Hello, World!
का उत्पादन करेगा Hello, World!
। -q
ध्वज बैनर को दबाता है जो आमतौर पर जब आप रन swipl
कहते हैं तो प्रदर्शित होता है। -l
लोड करने के लिए फ़ाइल निर्दिष्ट करता है।