प्रोलॉग

From Vigyanwiki
Revision as of 09:56, 27 February 2023 by alpha>Shalini Verma
प्रोलॉग
ParadigmLogic
द्वारा डिज़ाइन किया गयाAlain Colmerauer, Robert Kowalski
पहली प्रस्तुति1972; 52 years ago (1972)
Stable release
Part 1: General core-Edition 1 (June 1995; 29 years ago (1995-06))
Part 2: Modules-Edition 1 (June 2000; 24 years ago (2000-06))
टाइपिंग अनुशासनUntyped (its single data type is "term")
फ़ाइल नाम एक्सटेंशनएस.pl, .pro, .P
वेबसाइटPart 1: www.iso.org/standard/21413.html
Part 2: www.iso.org/standard/20775.html
Major implementations
B-Prolog, Ciao, ECLiPSe, GNU Prolog, Poplog Prolog, P#, Quintus Prolog, SICStus, Strawberry, SWI-Prolog, Tau Prolog, tuProlog, WIN-PROLOG, XSB, YAP.
Dialects
ISO Prolog, Edinburgh Prolog
Influenced by
Planner
Influenced
CHR, Clojure, Datalog, Erlang, KL0, KL1, Logtalk, Mercury, Oz, Strand, Visual Prolog, XSB

प्रोलॉग एक तर्क प्रोग्रामिंग भाषा है जो कृत्रिम सावधानी और कम्प्यूटेशनल भाषा विज्ञान से जुड़ी है।[1][2][3]

प्रोलॉग की जड़ें प्रथम-क्रम तर्क, एक औपचारिक तर्क में हैं, और कई अन्य प्रोग्रामिंग भाषाओं के विपरीत, प्रोलॉग मुख्य रूप से एक घोषणात्मक प्रोग्रामिंग भाषा के रूप में अभिप्रेत है: कार्यक्रम तर्क को अंतिम संबंध के रूप में व्यक्त किया जाता है, जिसे तथ्यों और अनुमान के नियम के रूप में दर्शाया जाता है। इन संबंधों पर एक क्वेरी चलाकर एक संगणना प्रारंभ की जाती है।[4]

एडिनबर्ग विश्वविद्यालय में रॉबर्ट कोवाल्स्की की हॉर्न क्लॉज की प्रक्रियात्मक व्याख्या के आधार पर, 1972 में एलेन कॉलमेरॉयर द्वारा फिलिप रसेल के साथ मार्सिले, फ्रांस में भाषा विकसित और कार्यान्वित की गई थी।[5][6][7]

प्रोलॉग पहली लॉजिक प्रोग्रामिंग भाषा में से एक थी[8] और आज भी इस प्रकार की सबसे लोकप्रिय भाषा बनी हुई है, जिसमें कई मुफ्त और व्यावसायिक कार्यान्वयन उपलब्ध हैं। स्वचालित प्रमेय सिद्ध करने के लिए भाषा का उपयोग[9] विशेषज्ञ प्रणालियां,[10] टर्म पुनर्लेखन,[11] टाइप प्रणाली,[12] और स्वचालित योजना,[13] साथ ही इसके उपयोग का मूल प्रयोजन क्षेत्र, प्राकृतिक भाषा प्रसंस्करण में किया गया है।[14][15] आधुनिक प्रोलॉग वातावरण ग्राफिकल यूज़र इंटरफ़ेस के साथ-साथ प्रशासनिक और नेटवर्क अनुप्रयोगों के निर्माण का समर्थन करते हैं।

प्रोलॉग विशिष्ट कार्यों के लिए अच्छी तरह से अनुकूल है जो नियम-आधारित तार्किक प्रश्नों से लाभान्वित होते हैं जैसे डेटाबेस खोजना, ध्वनि नियंत्रण प्रणाली और टेम्पलेट भरना।

वाक्य-विन्यास और शब्दार्थ

प्रोलॉग में, प्रोग्राम लॉजिक संबंधों के संदर्भ में व्यक्त किया जाता है, और इन संबंधों पर एक क्वेरी चलाकर एक संगणना प्रारंभ की जाती है। प्रोलॉग के एकल डेटा प्रकार, शब्द का उपयोग करके संबंधों और प्रश्नों का निर्माण किया जाता है।[4] संबंधों को खंडों द्वारा परिभाषित किया गया है। एक प्रश्न को देखते हुए, प्रोलॉग इंजन अस्वीकृत क्वेरी के संकल्प (तर्क) खंडन को ढूंढने का प्रयास करता है। यदि अस्वीकृत क्वेरी का खंडन किया जा सकता है, अर्थात, सभी मुक्त चर के लिए एक इंस्टेंटेशन पाया जाता है, जो क्लॉज़ का मिलन करता है और सिंगलटन सेट में नकारात्मक क्वेरी को अनुचित बनाता है, यह इस प्रकार है कि मूल क्वेरी, प्रयुक्त तात्कालिकता के साथ, कार्यक्रम का एक तार्किक परिणाम है। यह प्रोलॉग (और अन्य लॉजिक प्रोग्रामिंग भाषा) को विशेष रूप से डेटाबेस, प्रतीकात्मक गणित और भाषा पार्सिंग अनुप्रयोगों के लिए उपयोगी बनाता है। क्योंकि प्रोलॉग अशुद्ध विधेय (गणितीय तर्क) की अनुमति देता है, कुछ विशेष विधेय के सत्य मान की जाँच करने से कुछ सविचार दुष्प्रभाव जैसे कि स्क्रीन पर मूल्य प्रिंट करना हो सकते हैं। इस कारण से, तार्किक प्रतिमान असुविधाजनक होने पर प्रोग्रामर को कुछ मात्रा में पारंपरिक अनिवार्य प्रोग्रामिंग का उपयोग करने की अनुमति है। इसका विशुद्ध रूप से तार्किक उपसमुच्चय है, जिसे शुद्ध प्रोलॉग कहा जाता है, साथ ही साथ कई अतिरिक्त विशेषताएं भी हैं।

डेटा प्रकार

प्रोलॉग का एकल डेटा प्रकार शब्द है। नियम या तो परमाणु, संख्याएं, चर या यौगिक शब्द हैं।

  • एक 'परमाणु' एक सामान्य उद्देश्य वाला नाम है जिसका कोई अंतर्निहित अर्थ नहीं है। परमाणुओं के उदाहरणों में x, red, 'Taco', और 'some atom' सम्मिलित हैं।
  • संख्याएँ फ़्लोटिंग-पॉइंट अंकगणित या पूर्णांक हो सकती हैं। आईएसओ मानक संगत प्रोलॉग प्रणाली प्रोलॉग फ्लैग बाउंड की जांच कर सकते हैं। अधिकांश प्रमुख प्रोलॉग प्रणाली इच्छानुसार लंबाई पूर्णांक संख्याओं का समर्थन करते हैं।
  • वेरिएबल्स को अक्षरों, संख्याओं और अंडरस्कोर वर्णों वाली एक स्ट्रिंग द्वारा दर्शाया जाता है, और एक अपर-केस अक्षर या अंडरस्कोर से प्रारंभ होता है। वेरिएबल्स लॉजिक में वेरिएबल्स के समान हैं, जिसमें वे इच्छानुसार शब्दों के लिए प्लेसहोल्डर हैं।
  • एक मिश्रित शब्द एक परमाणु से बना होता है जिसे फ़ंक्टर कहा जाता है और कई तर्क होते हैं, जो फिर से शब्द होते हैं। यौगिक शब्दों को सामान्यतः एक कारक के रूप में लिखा जाता है, जिसके बाद तर्क शब्दों की अल्पविराम से अलग की गई सूची होती है, जो कोष्ठकों में निहित होती है। तर्कों की संख्या को शब्द की योग्यता कहा जाता है। एक परमाणु को शून्यता के साथ एक यौगिक शब्द के रूप में माना जा सकता है। person_friends(zelda,[tom,jim]) , यौगिक पद का उदाहरण है।

यौगिक शब्दों की विशेष स्थिति:

  • एक सूची शब्दों का एक क्रमबद्ध संग्रह है। इसे वर्गाकार कोष्ठकों द्वारा अल्पविराम से अलग किए गए शब्दों के साथ या खाली सूची की स्थिति में, [] द्वारा निरूपित किया जाता है। उदाहरण के लिए, [1,2,3] या [red,green,blue]
  • स्ट्रिंग्स: उद्धरणों से घिरे वर्णों का अनुक्रम या तो (संख्यात्मक) वर्ण कोडों की सूची, वर्णों की सूची (लंबाई 1 के परमाणु), या प्रोलॉग फ्लैग के double_quotes मान के आधार पर एक परमाणु के बराबर है।उदाहरण के लिए, "to be, or not to be".[16]

आईएसओ प्रोलॉग टाइप-चेकिंग के लिए प्रदान करता है atom/1, number/1, integer/1, और float/1 विधेय प्रदान करता है।[17]


नियम और तथ्य

प्रोलॉग प्रोग्राम संबंधों का वर्णन करते हैं, जो खंड के माध्यम से परिभाषित होते हैं। शुद्ध प्रोलॉग हॉर्न क्लॉज तक ही सीमित है। खंड दो प्रकार के होते हैं: तथ्य और नियम। एक नियम रूप का होता है

Head :- Body.

और हेड इज़ सही के रूप में पढ़ा जाता है यदि बॉडी सही है। नियम के मुख्य भाग में विधेय के लिए कॉल होते हैं, जिन्हें नियम का लक्ष्य कहा जाता है। अंतर्निहित तार्किक ऑपरेटर ,/2 (अर्थात् एक धर्मार्थ 2 ऑपरेटर (प्रोग्रामिंग) नाम के साथ ,) लक्ष्यों के तार्किक संयोजन को दर्शाता है, और ;/2 तार्किक संयोजन को दर्शाता है। संयोजन और वियोग केवल शरीर में प्रकट हो सकते हैं, किसी नियम के शीर्ष में नहीं प्रकट हो सकते हैं।

खाली शरीर वाले खंडों को तथ्य कहा जाता है। एक तथ्य का उदाहरण है:

cat(tom).

जो नियम के बराबर है:

cat(tom) :- true.

अंतर्निहित विधेय true/0 सदैव सच होता है।

उपरोक्त तथ्य को देखते हुए, कोई पूछ सकता है:

क्या टॉम बिल्ली है?

<वाक्यविन्यास लैंग = प्रोलॉग>


</वाक्यविन्यास हाइलाइट>

क्या टॉम बिल्ली है?

?- cat(tom).
 Yes

बिल्लियाँ क्या हैं?

 ?- cat(X).
 X = tom

</वाक्यविन्यास हाइलाइट>

निकायों वाले खंड 'नियम' कहलाते हैं। नियम का एक उदाहरण है:

animal(X) :- cat(X).

यदि हम उस नियम को जोड़ दें और पूछें कि जानवर क्या चीजें हैं?

<वाक्यविन्यास लैंग = प्रोलॉग>

?- animal(X).
X = tom

</वाक्यविन्यास हाइलाइट>

कई अंतर्निहित विधेय की संबंधपरक प्रकृति के कारण, वे सामान्यतः कई दिशाओं में उपयोग किए जा सकते हैं। उदाहरण के लिए, length/2 सूची की लंबाई निर्धारित करने के लिए उपयोग किया जा सकता है (length(List, L), दी हुई सूची List) साथ ही दी गई लंबाई की एक सूची कंकाल उत्पन्न करने के लिए (length(X, 5)), और दोनों सूची कंकाल और उनकी लंबाई एक साथ उत्पन्न करने के लिए (length(X, L))। इसी प्रकार, append/3 दो सूचियों को जोड़ने के लिए उपयोग किया जा सकता है, (append(ListA, ListB, X) दी गई सूचियाँ ListA और ListB साथ ही साथ दी गई सूची को भागों में विभाजित करने के लिए (append(X, Y, List), दी गयी सूची List के लियें उपयोग किया जा सकता है। इस कारण से, पुस्तकालय का तुलनात्मक रूप से छोटा सेट कई प्रोलॉग कार्यक्रमों के लिए पर्याप्त है।

एक सामान्य प्रयोजन की भाषा के रूप में, प्रोलॉग नियमित गतिविधियों जैसे इनपुट/आउटपुट, ग्राफिक्स का उपयोग करने और अन्यथा ऑपरेटिंग प्रणाली के साथ संचार करने के लिए विभिन्न अंतर्निहित विधेय भी प्रदान करता है। इन विधेय को एक संबंधपरक अर्थ नहीं दिया जाता है और वे केवल उन दुष्प्रभावों के लिए उपयोगी होते हैं जो वे प्रणाली पर प्रदर्शित करते हैं। उदाहरण के लिए, विधेय write/1 स्क्रीन पर एक शब्द प्रदर्शित करता है।

निष्पादन

एक प्रोलॉग प्रोग्राम का निष्पादन उपयोगकर्ता द्वारा एकल लक्ष्य की पोस्टिंग द्वारा प्रारंभ किया जाता है, जिसे क्वेरी कहा जाता है। तार्किक रूप से, प्रोलॉग इंजन अस्वीकृत क्वेरी के संकल्प (तर्क) खंडन को ढूंढने का प्रयास करता है। प्रोलॉग द्वारा उपयोग की जाने वाली रिज़ॉल्यूशन विधि को एसएलडी रिज़ॉल्यूशन कहा जाता है। यदि अस्वीकृत क्वेरी का खंडन किया जा सकता है, तो यह इस प्रकार है कि क्वेरी, उपयुक्त चर बाइंडिंग के साथ, कार्यक्रम का एक तार्किक परिणाम है। उस स्थिति में, सभी जेनरेट किए गए चर बाइंडिंग उपयोगकर्ता को सूचित किए जाते हैं, और कहा जाता है कि क्वेरी सफल हो गई है। क्रियात्मक रूप से, प्रोलॉग की निष्पादन रणनीति को अन्य भाषाओं में फलन कॉल के सामान्यीकरण के रूप में माना जा सकता है, एक अंतर यह है कि एकाधिक खंड शीर्ष किसी दिए गए कॉल से मेल खा सकते हैं। उस स्थिति में, प्रणाली पहले विकल्प के क्लॉज हेड के साथ एक विकल्प-बिंदु, एकीकरण लक्ष्य बनाता है, और उस पहले विकल्प के लक्ष्यों के साथ जारी रहता है। यदि प्रोग्राम को निष्पादित करने के समय कोई भी लक्ष्य विफल हो जाता है, तो सबसे आधुनिक पसंद-बिंदु बनाए जाने के बाद से किए गए सभी परिवर्तनीय बंधन पूर्ववत हो जाते हैं, और निष्पादन उस पसंद-बिंदु के अगले विकल्प के साथ जारी रहता है। इस निष्पादन रणनीति को कालानुक्रमिक बैक ट्रैकिंग कहा जाता है। उदाहरण के लिए:

<वाक्यविन्यास लैंग = प्रोलॉग>

मां_चाइल्ड (असभ्य, सैली)।

पिता_चाइल्ड (टॉम, सैली)।

पिता_चाइल्ड (टॉम, एरिका)।

पिता_चाइल्ड (माइक, टॉम)।

सहोदर (एक्स, वाई): - पेरेंट_चाइल्ड (जेड, एक्स), पैरेंट_चाइल्ड (जेड, वाई)।

माता-पिता_चाइल्ड (एक्स, वाई): - पिता_चाइल्ड (एक्स, वाई)।

पेरेंट_चाइल्ड (एक्स, वाई): - मदर_चाइल्ड (एक्स, वाई)।

</वाक्यविन्यास हाइलाइट>

इसके परिणामस्वरूप निम्न क्वेरी का मूल्यांकन सत्य के रूप में किया जा रहा है:

<वाक्यविन्यास लैंग = प्रोलॉग>

mother_child(trude, sally).
 
father_child(tom, sally).
father_child(tom, erica).
father_child(mike, tom).
 
sibling(X, Y)      :- parent_child(Z, X), parent_child(Z, Y).
 
parent_child(X, Y) :- father_child(X, Y).
parent_child(X, Y) :- mother_child(X, Y).
इसके परिणामस्वरूप निम्न क्वेरी का मूल्यांकन सत्य के रूप में किया जा रहा है:
?- sibling(sally, erica).
Yes


</वाक्यविन्यास हाइलाइट>

इसे निम्नानुसार प्राप्त किया जाता है: प्रारंभ में, क्वेरी के लिए केवल मिलान करने वाला क्लॉज-हेड sibling(sally, erica) पहला है, इसलिए क्वेरी को सिद्ध करना उस खंड के शरीर को उचित चर बाइंडिंग के साथ सिद्ध करने के बराबर है, अर्थात् संयोजन (parent_child(Z,sally), parent_child(Z,erica)) है। सिद्ध किया जाने वाला अगला लक्ष्य इस संयोजन का सबसे बायाँ लक्ष्य है, अर्थात, parent_child(Z, sally) है। दो खंड शीर्ष इस लक्ष्य से मेल खाते हैं। प्रणाली एक विकल्प-बिंदु बनाता है और पहले विकल्प की प्रयास करता है, जिसका शरीर father_child(Z, sally) है। तथ्य का उपयोग करके father_child(tom, sally) लक्ष्य को सिद्ध किया जा सकता है, इसलिए बंधन Z = tom उत्पन्न होता है, और सिद्ध किया जाने वाला अगला लक्ष्य उपरोक्त संयोजन का दूसरा भाग parent_child(tom, erica) है। फिर से, यह इसी तथ्य से सिद्ध किया जा सकता है। चूंकि सभी लक्ष्यों को सिद्ध किया जा सकता है, क्वेरी सफल होती है। चूंकि क्वेरी में कोई चर नहीं है, इसलिए उपयोगकर्ता को कोई बंधन नहीं बताया गया है। चर के साथ एक क्वेरी, जैसे:

?- father_child(Father, Child).

बैकट्रैकिंग पर सभी मान्य उत्तरों की गणना करता है।

ध्यान दें कि ऊपर बताए गए कोड के साथ, क्वेरी ?- sibling(sally, sally). भी सफल होता है। यदि वांछित हो, तो प्रासंगिक प्रतिबंधों का वर्णन करने के लिए अतिरिक्त लक्ष्य सम्मिलित होंगे।

लूप और प्रत्यावर्तन

पुनरावर्ती विधेय के माध्यम से पुनरावर्ती कलनविधि को प्रयुक्त किया जा सकता है।[18]


निषेध

बिल्ट-इन प्रोलॉग विधेय \+/1 विफलता के रूप में निषेध प्रदान करता है, जो गैर-मोनोटोनिक तर्क के लिए अनुमति देता है। लक्ष्य \+ illegal(X) नियम में

legal(X) :- \+ illegal(X).

निम्नानुसार मूल्यांकन किया जाता है: प्रोलॉग illegal(X) सिद्ध करने का प्रयास करता है। यदि उस लक्ष्य के लिए कोई प्रमाण मिल सकता है, तो मूल लक्ष्य (अर्थात, \+ illegal(X)) विफल रहता है। यदि कोई प्रमाण नहीं मिल पाता है, तो मूल लक्ष्य सफल हो जाता है। इसलिए \+/1 क्वेरी के बाद से उपसर्ग ऑपरेटर को सिद्ध करने योग्य ऑपरेटर नहीं कहा जाता है ?- \+ Goal. लक्ष्य सिद्ध नहीं होने पर सफल होता है। इस प्रकार का निषेध ध्वनि है यदि इसका तर्क ग्राउंड एक्सप्रेशन (अर्थात् कोई चर नहीं) है। यदि तर्क में चर हैं और प्रमाण प्रक्रिया पूरी हो गई है तो ध्वनि खो जाती है। विशेष रूप से, क्वेरी ?- legal(X). अब नियमबद्ध चीजों की गणना करने के लिए उपयोग नहीं किया जा सकता है।

प्रोलॉग में प्रोग्रामिंग

प्रोलॉग में, लोडिंग कोड को परामर्श के रूप में जाना जाता है। प्रोलॉग प्रॉम्प्ट पर प्रश्नों को दर्ज करके प्रोलॉग को अंतःक्रियात्मक रूप से उपयोग किया जा सकता है ?-. यदि कोई समाधान नहीं है, प्रोलॉग लिखता है no. यदि कोई समाधान उपस्थित है तो उसे मुद्रित किया जाता है। यदि क्वेरी के कई समाधान हैं, तो सेमी-कोलन दर्ज करके इनका अनुरोध किया जा सकता है ;. कोड दक्षता, पठनीयता और रखरखाव में सुधार के लिए अच्छे प्रोग्रामिंग अभ्यास पर दिशानिर्देश हैं।[19] यहां प्रोलॉग में लिखे कुछ उदाहरण कार्यक्रमों का अनुसरण करें।

हैलो वर्ल्ड

क्वेरी का एक उदाहरण:

?- write('Hello World!'), nl.
Hello World!
true.

?-

संकलक अनुकूलन

राज्य संक्रमण के अनुक्रम के रूप में किसी भी गणना को घोषणात्मक रूप से व्यक्त किया जा सकता है। एक उदाहरण के रूप में, तीन ऑप्टिमाइज़ेशन पास वाले एक अनुकूलन संकलक को प्रारंभिक प्रोग्राम और उसके अनुकूलित रूप के बीच संबंध के रूप में कार्यान्वित किया जा सकता है:

<वाक्यविन्यास लैंग = प्रोलॉग> प्रोग्राम_ऑप्टिमाइज्ड (प्रोग0, प्रोग) :-

   program_optimized(Prog0, Prog) :-
    optimization_pass_1(Prog0, Prog1),
    optimization_pass_2(Prog1, Prog2),
    optimization_pass_3(Prog2, Prog).

</वाक्यविन्यास हाइलाइट>

या समान रूप से निश्चित खंड व्याकरण संकेतन का उपयोग करना:

program_optimized --> optimization_pass_1, optimization_pass_2, optimization_pass_3.

<वाक्यविन्यास लैंग = प्रोलॉग> प्रोग्राम_ऑप्टिमाइज्ड --> ऑप्टिमाइज़ेशन_पास_1, ऑप्टिमाइज़ेशन_पास_2, ऑप्टिमाइज़ेशन_पास_3। </वाक्यविन्यास हाइलाइट>

क्विकसॉर्ट

त्वरित छँटाई कलनविधि, एक सूची को उसके क्रमबद्ध संस्करण से संबंधित करता है: <वाक्यविन्यास लैंग = प्रोलॉग> विभाजन ([], _, [], [])। विभाजन ([X|Xs], पिवोट, स्माल्स, बिग्स): -

  partition([], _, [], []).
partition([X|Xs], Pivot, Smalls, Bigs) :-
    (   X @< Pivot ->
        Smalls = [X|Rest],
        partition(Xs, Pivot, Rest, Bigs)
    ;   Bigs = [X|Rest],
        partition(Xs, Pivot, Smalls, Rest)
    ).
 
quicksort([])     --> [].
quicksort([X|Xs]) -->
    { partition(Xs, X, Smaller, Bigger) },
    quicksort(Smaller), [X], quicksort(Bigger).

</वाक्यविन्यास हाइलाइट>

प्रोलॉग के डिजाइन पैटर्न

एक डिज़ाइन पैटर्न (कंप्यूटर विज्ञान) सॉफ़्टवेयर डिज़ाइन में सामान्य रूप से होने वाली समस्या का एक सामान्य पुन: प्रयोज्य समाधान है। प्रोलॉग में कुछ डिज़ाइन पैटर्न कंकाल, तकनीक,[20][21] क्लिचेस,[22] कार्यक्रम आरेख[23] तर्क विवरण स्कीमाटा,[24] और उच्च क्रम प्रोग्रामिंग हैं।[25]


उच्च क्रम प्रोग्रामिंग

एक उच्च-क्रम विधेय एक विधेय है जो तर्कों के रूप में एक या अधिक अन्य विधेय लेता है। चूंकि उच्च-क्रम प्रोग्रामिंग के लिए समर्थन प्रोलॉग को प्रथम-क्रम तर्क के क्षेत्र से बाहर ले जाता है, जो विधेय पर परिमाणीकरण की अनुमति नहीं देता है,[26] आईएसओ प्रोलॉग में अब कुछ अंतर्निहित उच्च-क्रम विधेय हैं जैसे call/1, call/2, call/3, findall/3, setof/3, और bagof/3.[27] इसके अतिरिक्त, चूंकि मनमाने ढंग से प्रोलॉग लक्ष्यों का निर्माण और रन-टाइम पर मूल्यांकन किया जा सकता है, इसलिए उच्च-क्रम के विधेय को लिखना आसान है जैसे maplist/2, जो किसी दी गई सूची के प्रत्येक सदस्य के लिए एक इच्छानुसार विधेय प्रयुक्त करता है, और sublist/3, जो किसी दिए गए विधेय को संतुष्ट करने वाले तत्वों को फ़िल्टर करता है, साथ ही करी करने की भी अनुमति देता है।[25]

स्थानिक प्रतिनिधित्व (नियमो) में अस्थायी प्रतिनिधित्व (बैकट्रैकिंग पर उत्तर प्रतिस्थापन) से समाधानों को परिवर्तित करने के लिए, प्रोलॉग में विभिन्न सभी-समाधान विधेय हैं जो एक सूची में दी गई क्वेरी के सभी उत्तर प्रतिस्थापन एकत्र करते हैं। इसका उपयोग सूची समझ के लिए किया जा सकता है। उदाहरण के लिए, पूर्ण संख्याएँ उनके उचित विभाजकों के योग के बराबर होती हैं: <वाक्यविन्यास लैंग = प्रोलॉग>

 perfect(N) :-
     between(1, inf, N), U is N // 2,
     findall(D, (between(1,U,D), N mod D =:= 0), Ds),
     sumlist(Ds, N).

</वाक्यविन्यास हाइलाइट>

इसका उपयोग पूर्ण संख्याओं की गणना करने के लिए किया जा सकता है, और यह जांचने के लिए भी किया जा सकता है कि कोई संख्या पूर्ण है या नहीं है।

एक अन्य उदाहरण के रूप में, विधेय maplist एक विधेय प्रयुक्त करता है P सूचियों की एक जोड़ी में सभी संबंधित पदों के लिए:

<वाक्यविन्यास लैंग = प्रोलॉग>

maplist(_, [], []).
maplist(P, [X|Xs], [Y|Ys]) :-
   call(P, X, Y), 


  maplist (P, Xs, Ys).

</वाक्यविन्यास हाइलाइट>

कब P एक विधेय है जो सभी के लिए है X, P(X,Y) एकीकृत Y एक अद्वितीय मूल्य के साथ, maplist(P, Xs, Ys) कार्यात्मक प्रोग्रामिंग में मानचित्र (उच्च-क्रम फलन) फलन को प्रयुक्त करने के बराबर है Ys = map(Function, Xs) को प्रयुक्त करने के बराबर है।

प्रोलॉग में उच्च-क्रम प्रोग्रामिंग शैली का नेतृत्व हायलॉग और λ प्रोलॉग में किया गया था।

मॉड्यूल

बड़े में प्रोग्रामिंग और छोटे में प्रोग्रामिंग के लिए # बड़े में प्रोग्रामिंग, प्रोलॉग एक मॉड्यूलर प्रोग्रामिंग प्रदान करता है। मॉड्यूल प्रणाली आईएसओ द्वारा मानकीकृत है।[28] चूंकि, सभी प्रोलॉग कंपाइलर्स मॉड्यूल का समर्थन नहीं करते हैं, और प्रमुख प्रोलॉग कंपाइलर्स के मॉड्यूल प्रणाली के बीच संगतता समस्याएं हैं।[29] परिणामस्वरूप, एक प्रोलॉग कंपाइलर पर लिखे गए मॉड्यूल जरूरी नहीं कि दूसरों पर काम करेंगे।

पार्सिंग

निश्चित खंड व्याकरण (डीसीजी) नामक एक विशेष संकेतन है। expand_term/2 के माध्यम से परिभाषित एक नियम -->/2 के अतिरिक्त :-/2 प्रीप्रोसेसर द्वारा विस्तारित किया गया है, अन्य भाषाओं में मैक्रोज़ के अनुरूप एक सुविधा) कुछ सीधे पुनर्लेखन नियमों के अनुसार, जिसके परिणामस्वरूप सामान्य प्रोलॉग खंड होते हैं। सबसे विशेष रूप से, पुनर्लेखन विधेय को दो अतिरिक्त तर्कों से लैस करता है, जिसका उपयोग आस-पास की स्थिति को थ्रेड करने के लिए किया जा सकता है,[clarification needed] अन्य भाषाओं में कार्यात्मक प्रोग्रामिंग में मोनैड के समान। DCG का उपयोग अक्सर पार्सर्स या सूची जनरेटर लिखने के लिए किया जाता है, क्योंकि वे अंतर सूचियों के लिए एक सुविधाजनक इंटरफ़ेस भी प्रदान करते हैं।

मेटा-दुभाषिया और प्रतिबिंब

प्रोलॉग एक समरूप भाषा है और प्रतिबिंब (कंप्यूटर विज्ञान) के लिए कई सुविधाएं प्रदान करती है। इसकी अंतर्निहित निष्पादन रणनीति शुद्ध प्रोलॉग कोड के लिए संक्षिप्त मेटा-सर्कुलर मूल्यांकनकर्ता (जिसे मेटा-इंटरप्रेटर भी कहा जाता है) लिखना संभव बनाता है:

<वाक्यविन्यास लैंग = प्रोलॉग> हल (सच)। हल((सबगोल1,सबगोल2)) :-

   हल करें (सबगोल 1),
   हल करें (सबगोल 2)।

हल (सिर) :-

   खंड (सिर, शरीर),
   हल (शरीर)।

</वाक्यविन्यास हाइलाइट> कहाँ true एक खाली संयोजन का प्रतिनिधित्व करता है, और clause(Head, Body) प्रपत्र के डेटाबेस में खंडों के साथ एकीकृत करता है Head :- Body.

चूंकि प्रोलॉग कार्यक्रम स्वयं प्रोलॉग नियमो के अनुक्रम हैं (:-/2 एक इंफिक्स ऑपरेटर (प्रोग्रामिंग) है जिसे अंतर्निहित तंत्र (जैसे read/1), अनुकूलित दुभाषियों को लिखना संभव है जो डोमेन-विशिष्ट विशेषताओं के साथ प्रोलॉग को बढ़ाते हैं। उदाहरण के लिए, स्टर्लिंग और शापिरो एक मेटा-दुभाषिया प्रस्तुत करते हैं जो अनिश्चितता के साथ तर्क करता है, यहां मामूली संशोधनों के साथ पुन: प्रस्तुत किया गया है:[30]: 330  <वाक्यविन्यास लैंग = प्रोलॉग> हल (सत्य, 1) :- !. हल((सबगोल1,सबगोल2), निश्चितता) :-

   !,
   हल करें (सबगोल 1, निश्चितता 1),
   समाधान (सबगोल2, निश्चितता2),
   निश्चितता न्यूनतम है (निश्चितता1, निश्चितता2)।

हल (लक्ष्य, 1) :-

   बिल्टिन (लक्ष्य),!,
   लक्ष्य।

हल (सिर, निश्चितता) :-

   क्लॉज_सीएफ (सिर, शरीर, निश्चितता 1),
   हल (बॉडी, निश्चितता 2),
   निश्चितता निश्चितता है 1 * निश्चितता 2।

</वाक्यविन्यास हाइलाइट>

यह दुभाषिया फॉर्म के अंतर्निर्मित प्रोलॉग की एक तालिका का उपयोग करता है[30]: 327  <वाक्यविन्यास लैंग = प्रोलॉग> बिल्टिन (ए बी है)। बिल्टिन (पढ़ें (एक्स))। % वगैरह। </वाक्यविन्यास हाइलाइट>

और खंड के रूप में प्रतिनिधित्व किया clause_cf(Head, Body, Certainty). उनको देखते हुए, इसे कहा जा सकता है solve(Goal, Certainty) अंजाम देना Goal और परिणाम के बारे में निश्चितता प्राप्त करें।

ट्यूरिंग पूर्णता

शुद्ध प्रोलॉग फर्स्ट-ऑर्डर प्रेडिकेट लॉजिक, हॉर्न क्लॉज के सबसेट पर आधारित है, जो ट्यूरिंग पूर्णता है। ट्यूरिंग-पूर्ण। ट्यूरिंग मशीन का अनुकरण करने के लिए प्रोलॉग की ट्यूरिंग पूर्णता को इसका उपयोग करके दिखाया जा सकता है: <वाक्यविन्यास लैंग = प्रोलॉग> ट्यूरिंग(टेप0, टेप) :-

   प्रदर्शन (क्यू0, [], एलएस, टेप0, रुपये),
   रिवर्स (एलएस, एलएस 1),
   संलग्न करें (एलएस 1, रुपये, टेप)।

प्रदर्शन (क्यूएफ, एलएस, एलएस, रुपये, रुपये) :- !. प्रदर्शन (Q0, Ls0, Ls, Rs0, Rs): -

   प्रतीक (रु0, सिम, रु.रेस्ट),
   एक बार (नियम (Q0, Sym, Q1, NewSym, Action)),
   कार्रवाई (कार्रवाई, Ls0, Ls1, [NewSym|RsRest], Rs1),
   प्रदर्शन (Q1, Ls1, Ls, Rs1, Rs)।

प्रतीक ([], बी, [])। प्रतीक ([Sym | रुपये], प्रतीक, रुपये)।

कार्रवाई (बाएं, एलएस0, एलएस, रुपये0, रुपये) :- बाएं (एलएस0, एलएस, रुपये0, रुपये)। कार्रवाई (रहना, एलएस, एलएस, रुपये, रुपये)। कार्रवाई (दाएं, Ls0, [Sym|Ls0], [Sym|Rs], रुपये)।

बाएं ([], [], रुपये0, [बी|रुपये0])। बायां ([एल | एलएस], एलएस, रुपये, [एल | रुपये])। </वाक्यविन्यास हाइलाइट>

ट्यूरिंग मशीन का एक सरल उदाहरण तथ्यों द्वारा निर्दिष्ट किया गया है: <वाक्यविन्यास लैंग = प्रोलॉग> नियम (q0, 1, q0, 1, दाएं)। नियम (क्यू0, बी, क्यूएफ, 1, रहना)। </वाक्यविन्यास हाइलाइट>

यह मशीन यूनरी एन्कोडिंग में किसी एक संख्या से वृद्धि करती है: यह किसी भी संख्या में 1 कोशिकाओं पर लूप करती है और अंत में एक अतिरिक्त 1 जोड़ती है। उदाहरण क्वेरी और परिणाम: <वाक्यविन्यास लैंग = प्रोलॉग> ?- ट्यूरिंग ([1,1,1], टीएस)। टी = [1, 1, 1, 1]; </वाक्यविन्यास हाइलाइट>

यह दर्शाता है कि कैसे किसी भी संगणना को घोषणात्मक रूप से राज्य के संक्रमण के अनुक्रम के रूप में व्यक्त किया जा सकता है, जिसे प्रोलॉग में ब्याज के निरंतर राज्यों के बीच संबंध के रूप में प्रयुक्त किया गया है।

कार्यान्वयन


आईएसओ प्रोलॉग

मानकीकरण के लिए अंतर्राष्ट्रीय संगठन प्रोलॉग मानक में दो भाग होते हैं। आईएसओ/आईईसी 13211-1,[27][31] 1995 में प्रकाशित, का उद्देश्य प्रोलॉग के मूल तत्वों के कई कार्यान्वयनों की उपस्थिता प्रथाओं को मानकीकृत करना है। इसने भाषा के उन पहलुओं को स्पष्ट किया है जो पहले अस्पष्ट थे और पोर्टेबल कार्यक्रमों की ओर ले जाते हैं। शुद्धिपत्र तीन हैं: कुरि.1:2007,[32] Cor.2:2012,[33] और Cor.3:2017।[34] आईएसओ/आईईसी 13211-2,[27]2000 में प्रकाशित, मानक में मॉड्यूल के लिए समर्थन जोड़ता है। मानक को JTC1|ISO/IEC JTC1/SC22/WG17 द्वारा बनाए रखा जाता है[35] काम करने वाला समहू। ANSI X3J17 मानक के लिए अमेरिकी तकनीकी सलाहकार समूह है।[36]


संकलन

दक्षता के लिए, प्रोलॉग कोड को सामान्यतः अमूर्त मशीन कोड में संकलित किया जाता है, जो अक्सर रजिस्टर-आधारित वॉरेन सार मशीन (डब्ल्यूएएम) निर्देश सेट से प्रभावित होता है।[37] कुछ कार्यान्वयन संकलन समय पर विधेय के प्रकार और मोड की जानकारी प्राप्त करने के लिए अमूर्त व्याख्या को नियोजित करते हैं, या उच्च प्रदर्शन के लिए वास्तविक मशीन कोड को संकलित करते हैं।[38] प्रोलॉग कोड के लिए कुशल कार्यान्वयन विधियों को तैयार करना तर्क प्रोग्रामिंग समुदाय में सक्रिय शोध का एक क्षेत्र है, और कुछ क्रियान्वयनों में कई अन्य निष्पादन विधियों को नियोजित किया जाता है। इनमें खंड द्वैतकरण और स्टैक मशीन | स्टैक-आधारित वर्चुअल मशीन सम्मिलित हैं।[citation needed]


टेल प्रत्यावर्तन

प्रोलॉग प्रणाली सामान्यतः टेल कॉल # टेल कॉल ऑप्टिमाइज़ेशन (TCO) नामक एक प्रसिद्ध ऑप्टिमाइज़ेशन पद्धति को प्रयुक्त करते हैं, जो नियतात्मक भविष्यवाणियों के लिए टेल प्रत्यावर्तन या अधिक सामान्यतः, टेल कॉल्स को प्रदर्शित करता है: टेल पोजीशन में कॉल करने से पहले क्लॉज़ के स्टैक फ्रेम को छोड़ दिया जाता है। इसलिए, नियतात्मक पूँछ-पुनरावर्ती विधेय को स्थिर स्टैक स्पेस के साथ निष्पादित किया जाता है, जैसे अन्य भाषाओं में लूप।

टर्म इंडेक्सिंग

किसी क्वेरी में किसी शब्द के साथ अनुपयोगी होने वाले खंड ढूँढना खंडों की संख्या में रैखिक है। टर्म इंडेक्सिंग एक डेटा संरचना का उपयोग करता है जो सबलाइनियर टाइम | सब-लीनियर-टाइम लुकअप को सक्षम करता है।[39] अनुक्रमण केवल कार्यक्रम के प्रदर्शन को प्रभावित करता है, यह शब्दार्थ को प्रभावित नहीं करता है। अधिकांश प्रोलॉग्स केवल पहले शब्द पर अनुक्रमण का उपयोग करते हैं, क्योंकि सभी नियमो पर अनुक्रमण करना महंगा है, लेकिन फ़ील्ड-एन्कोडेड शब्दों या सुपरइम्पोज़्ड कोड कोडवर्ड पर आधारित तकनीकें पूर्ण क्वेरी और शीर्ष पर तेज़ अनुक्रमण प्रदान करती हैं।[40][41]


हैशिंग

कुछ प्रोलॉग प्रणाली, जैसे तर्क प्रोग्रामिंग एसोसिएट्स | विन-प्रोलॉग और एसडब्ल्यूआई-प्रोलॉग, अब बड़े डेटासेट को अधिक कुशलता से संभालने में सहायता करने के लिए हैशिंग प्रयुक्त करते हैं। वर्डनेट जैसे बड़े कॉर्पोरा के साथ काम करने पर यह बहुत बड़ा प्रदर्शन लाभ देता है।

टेबलिंग

कुछ प्रोलॉग प्रणाली, (बी-प्रोलॉग, एक्सएसबी, एसडब्ल्यूआई-प्रोलॉग, वाईएपी (प्रोलॉग), और सीआओ (प्रोग्रामिंग भाषा)), टेबलिंग नामक memoization विधि को प्रयुक्त करते हैं, जो उपयोगकर्ता को मध्यवर्ती परिणामों को मैन्युअल रूप से संग्रहीत करने से मुक्त करता है। टेबलिंग एक स्पेस-टाइम ट्रेडऑफ़ है; मध्यवर्ती परिणामों को संग्रहीत करने के लिए अधिक मेमोरी का उपयोग करके निष्पादन समय को कम किया जा सकता है:[42][43]

क्वेरी मूल्यांकन में सामने आए उपलक्ष्यों को इन उपलक्ष्यों के उत्तरों के साथ एक तालिका में बनाए रखा जाता है। यदि कोई उप-लक्ष्य फिर से मिलता है, तो मूल्यांकन प्रोग्राम क्लॉज के खिलाफ संकल्प को फिर से करने के अतिरिक्त तालिका से जानकारी का पुन: उपयोग करता है।[44]</ब्लॉककोट>

टेबलिंग को विभिन्न दिशाओं में बढ़ाया जा सकता है। यह एसएलजी-रिज़ॉल्यूशन या लीनियर टेबलिंग के माध्यम से पुनरावर्ती विधेय का समर्थन कर सकता है। बहु-थ्रेडेड प्रोलॉग प्रणाली में टेबलिंग परिणामों को एक थ्रेड के लिए निजी रखा जा सकता है या सभी थ्रेड्स के बीच साझा किया जा सकता है। और वृद्धिशील टेबलिंग में, टेबलिंग परिवर्तनों पर प्रतिक्रिया कर सकती है।

हार्डवेयर में कार्यान्वयन

पांचवीं पीढ़ी पांचवीं पीढ़ी के कंप्यूटर प्रणाली प्रोजेक्ट समय समर्पित आर्किटेक्चर के साथ तेजी से निष्पादन प्राप्त करने के उद्देश्य से हार्डवेयर में प्रोलॉग को प्रयुक्त करने का प्रयास किया गया था।[45][46][47] इसके अतिरिक्त, प्रोलॉग में कई गुण हैं जो समानांतर निष्पादन के माध्यम से गति बढ़ाने की अनुमति दे सकते हैं।[48] प्रतिबंधित प्रोलॉग प्रोग्राम को फ़ील्ड प्रोग्राम करने योग्य गेट सरणी में संकलित करने के लिए एक और आधुनिक दृष्टिकोण रहा है।[49] चूंकि, सामान्य-उद्देश्य वाले हार्डवेयर में तेजी से प्रगति ने निरंतर अधिक विशिष्ट आर्किटेक्चर को पीछे छोड़ दिया है।

सेगा ने 1986 में जापानी व्यापार के लिए जारी किए गए सेगा एआई कंप्यूटर के साथ उपयोग के लिए प्रोलॉग को प्रयुक्त किया। प्रोलॉग का उपयोग टच पैड के माध्यम से जापानी भाषा में प्राकृतिक भाषा इनपुट पढ़ने के लिए किया गया था।[50]


सीमाएं

यद्यपि अनुसंधान और शिक्षा में प्रोलॉग का व्यापक रूप से उपयोग किया जाता है,[citation needed] प्रोलॉग और अन्य लॉजिक प्रोग्रामिंग भाषाओं का सामान्य रूप से कंप्यूटर उद्योग पर महत्वपूर्ण प्रभाव नहीं पड़ा है।[51] अधिकांश अनुप्रयोग औद्योगिक मानकों से छोटे होते हैं, कोड की 100,000 से अधिक पंक्तियों के साथ।[51][52] बड़े पैमाने पर प्रोग्रामिंग को जटिल माना जाता है क्योंकि सभी प्रोलॉग कंपाइलर्स मॉड्यूल का समर्थन नहीं करते हैं, और प्रमुख प्रोलॉग कंपाइलर्स के मॉड्यूल प्रणाली के बीच संगतता समस्याएं हैं।[29] कार्यान्वयन के समय प्रोलॉग कोड की पोर्टेबिलिटी भी एक समस्या रही है, लेकिन 2007 के बाद से हुए विकास का मतलब है: एडिनबर्ग/क्विंटस व्युत्पन्न प्रोलॉग कार्यान्वयन के परिवार के अन्दर पोर्टेबिलिटी पोर्टेबल वास्तविक विश्व अनुप्रयोगों को बनाए रखने की अनुमति देने के लिए पर्याप्त है।[53]

प्रोलॉग में विकसित सॉफ्टवेयर की पारंपरिक प्रोग्रामिंग भाषाओं की तुलना में उच्च प्रदर्शन दंड के लिए आलोचना की गई है। विशेष रूप से, प्रोलॉग की गैर-नियतात्मक मूल्यांकन रणनीति समस्याग्रस्त हो सकती है जब नियतात्मक संगणनाओं की प्रोग्रामिंग की जाती है, या जब भी गैर-नियतत्ववाद की परवाह नहीं करते हैं (जहां सभी संभावनाओं पर पीछे हटने के अतिरिक्त एक ही विकल्प बनाया जाता है)। वांछनीय प्रदर्शन प्राप्त करने के लिए कट्स और अन्य भाषा निर्माणों का उपयोग करना पड़ सकता है, जो प्रोलॉग के मुख्य आकर्षणों में से एक को नष्ट कर देता है, कार्यक्रमों को पीछे और आगे चलाने की क्षमता।[54]

प्रोलॉग विशुद्ध रूप से घोषणात्मक नहीं है: कट (तर्क प्रोग्रामिंग) जैसी संरचनाओं के कारण, इसे समझने के लिए प्रोलॉग प्रोग्राम की एक प्रक्रियात्मक रीडिंग की आवश्यकता होती है।[55] प्रोलॉग प्रोग्राम में क्लॉज का क्रम महत्वपूर्ण है, क्योंकि भाषा की निष्पादन रणनीति इस पर निर्भर करती है।[56] अन्य लॉजिक प्रोग्रामिंग भाषा, जैसे कि डेटालॉग, वास्तव में घोषणात्मक हैं, लेकिन भाषा को प्रतिबंधित करती हैं। परिणामस्वरूप, कई व्यावहारिक प्रोलॉग प्रोग्राम विशुद्ध रूप से घोषणात्मक तर्क कार्यक्रमों के अतिरिक्त प्रोलॉग के गहराई-पहले खोज क्रम के अनुरूप लिखे गए हैं।[54]


एक्सटेंशन

तर्क प्रोग्रामिंग क्षमताओं को कई दिशाओं में विस्तारित करने के लिए प्रोलॉग से विभिन्न कार्यान्वयन विकसित किए गए हैं। इनमें टाइप प्रणाली, मोड्स, बाधा तर्क प्रोग्रामिंग (CLP), ऑब्जेक्ट-ओरिएंटेड लॉजिक प्रोग्रामिंग (OOLP), कॉन्करेंसी, रैखिक तर्क (LLP), फंक्शनल और उच्च क्रम तर्क प्रोग्रामिंग क्षमताएं, साथ ही ज्ञानधार के साथ इंटरऑपरेबिलिटी सम्मिलित हैं:

प्रकार

प्रोलॉग एक अप्रकाशित भाषा है। 1980 के दशक के प्रकारों को प्रस्तुत करने का प्रयास,[57][58] और 2008 तक अभी भी प्रोलॉग को प्रकारों के साथ विस्तारित करने का प्रयास किया जा रहा है।[59] प्रकार की जानकारी न केवल प्रकार की सुरक्षा के लिए उपयोगी है बल्कि प्रोलॉग प्रोग्राम के बारे में तर्क करने के लिए भी उपयोगी है।Apt, K. R.; Marchiori, E. (1994). "प्रोलॉग प्रोग्राम के बारे में तर्क: मोड से प्रकार से अभिकथन तक". Formal Aspects of Computing. 6 (S1): 743. CiteSeerX 10.1.1.57.395. doi:10.1007/BF01213601. S2CID 12235465.</रेफरी>

मोड

Mode specifier Interpretation
+ nonvar on entry
- var on entry
? Not specified

प्रोलॉग का वाक्य-विन्यास यह निर्दिष्ट नहीं करता है कि विधेय के कौन से तर्क इनपुट हैं और कौन से आउटपुट हैं।[60] हालाँकि, यह जानकारी महत्वपूर्ण है और यह अनुशंसा की जाती है कि इसे टिप्पणियों में सम्मिलित किया जाए।[61] प्रोलॉग प्रोग्राम के बारे में तर्क करते समय मोड मूल्यवान जानकारी प्रदान करते हैंCite error: Invalid <ref> tag; invalid names, e.g. too many और निष्पादन में तेजी लाने के लिए भी इसका उपयोग किया जा सकता है।[62]


बाधाएं

बाधा तर्क प्रोग्रामिंग बाधा संतुष्टि से अवधारणाओं को सम्मिलित करने के लिए प्रोलॉग का विस्तार करती है।[63][64] एक बाधा तर्क कार्यक्रम खंडों के शरीर में बाधाओं की अनुमति देता है, जैसे कि: A(X,Y) :- X+Y>0. यह बड़े पैमाने पर दहनशील अनुकूलन समस्याओं के अनुकूल है[65] और इस प्रकार स्वचालित टाइम-टेबलिंग और उत्पादन शेड्यूलिंग जैसे औद्योगिक सेटिंग्स में अनुप्रयोगों के लिए उपयोगी है। अधिकांश प्रोलॉग प्रणाली परिमित डोमेन के लिए कम से कम एक बाधा सॉल्वर के साथ शिप करते हैं, और अक्सर तर्कसंगत संख्याओं जैसे अन्य डोमेन के लिए सॉल्वर के साथ भी।

ऑब्जेक्ट-ओरिएंटेशन

फ्लोरा-2 -2 एक वस्तु-उन्मुख ज्ञान प्रतिनिधित्व और तर्क प्रणाली है जो एफ तर्क पर आधारित है और इसमें HiLog, लेनदेन तर्क और दोषपूर्ण तर्क सम्मिलित है।

लॉगटॉक एक ऑब्जेक्ट-ओरिएंटेड लॉजिक प्रोग्रामिंग भाषा है जो बैक-एंड कंपाइलर के रूप में अधिकांश प्रोलॉग कार्यान्वयन का उपयोग कर सकती है। बहु-प्रतिमान भाषा के रूप में, इसमें प्रोटोटाइप और कक्षाओं दोनों के लिए समर्थन सम्मिलित है।

परत एडसीएएडी, एडिनबर्ग विश्वविद्यालय के मार्गरेट मैकडॉगल द्वारा प्रोलॉग के लिए एक छोटा, पोर्टेबल, ऑब्जेक्ट-ओरिएंटेड एक्सटेंशन है।

ओब्जॉग सीएनआरएस, मार्सिले, फ्रांस से वस्तुओं और प्रोलॉग II के संयोजन वाली एक फ्रेम-आधारित भाषा थी।

प्रोलॉग++ को Logic Programming Associates द्वारा विकसित किया गया था और पहली बार 1989 में MS-DOS PC के लिए जारी किया गया था। अन्य प्लेटफार्मों के लिए समर्थन जोड़ा गया था, और एक दूसरा संस्करण 1995 में जारी किया गया था। क्रिस मॉस द्वारा प्रोलॉग ++ के बारे में एक पुस्तक एडिसन-वेस्ली द्वारा 1994 में प्रकाशित की गई थी।

विज़ुअल प्रोलॉग एक बहु-प्रतिमान भाषा है जिसमें इंटरफेस, कक्षाएं, कार्यान्वयन और ऑब्जेक्ट एक्सप्रेशन हैं।

ग्राफिक्स

प्रोलॉग प्रणाली जो ग्राफिक्स लाइब्रेरी प्रदान करते हैं वे हैं SWI-प्रोलॉग,[66] विजुअल प्रोलॉग, लॉजिक प्रोग्रामिंग एसोसिएट्स | विन-प्रोलॉग और बी-प्रोलॉग।

संगामिति

संदेश पासिंग इंटरफ़ेस पर वितरित कंप्यूटिंग के लिए प्रोलॉग-एमपीआई एक ओपन-सोर्स एसडब्ल्यूआई-प्रोलॉग एक्सटेंशन है।[67] साथ ही विभिन्न समवर्ती प्रोलॉग प्रोग्रामिंग भाषाएं भी हैं।[68]


वेब प्रोग्रामिंग

कुछ प्रोलॉग कार्यान्वयन, विशेष रूप से विज़ुअल प्रोलॉग, एसडब्ल्यूआई-प्रोलॉग और सीआओ (प्रोग्रामिंग भाषा), वेब प्रोटोकॉल, एचटीएमएल और एक्सएमएल के समर्थन के साथ सर्वर-साइड वेब प्रोग्रामिंग का समर्थन करते हैं।[69] सिमेंटिक वेब प्रारूपों जैसे कि संसाधन विवरण फ्रेमवर्क और वेब ओन्टोलॉजी भाषा का समर्थन करने के लिए एक्सटेंशन भी हैं।[70][71] प्रोलॉग को ग्राहक की ओर भाषा के रूप में भी सुझाया गया है।[72] इसके अतिरिक्त विज़ुअल प्रोलॉग JSON-RPC और Websockets का समर्थन करता है।

एडोब फ्लैश

सीडर एक निःशुल्क और बुनियादी प्रोलॉग दुभाषिया है। संस्करण 4 और ऊपर के सीडर में एफसीए (फ्लैश सीडर ऐप) का समर्थन है। यह ActionScript के माध्यम से प्रोलॉग में प्रोग्रामिंग के लिए एक नया मंच प्रदान करता है।

अन्य

  • एफ-लॉजिक ज्ञान प्रतिनिधित्व के लिए फ्रेम/ऑब्जेक्ट्स के साथ प्रोलॉग का विस्तार करता है।
  • लेन-देन तर्क राज्य-बदलते अद्यतन ऑपरेटरों के एक तार्किक सिद्धांत के साथ प्रोलॉग का विस्तार करता है। इसमें एक मॉडल-सैद्धांतिक और प्रक्रियात्मक शब्दार्थ दोनों हैं।
  • ओडब्ल्यू प्रोलॉग ओ ओ प्रोलॉग में ग्राफिक्स और इंटरफेस की कमी का उत्तर देने के लिए बनाया गया है।

अन्य भाषाओं के लिए इंटरफेस

फ्रेमवर्क उपस्थित हैं जो प्रोलॉग और अन्य भाषाओं के बीच पुल कर सकते हैं:

  • एलपीए इंटेलिजेंस सर्वर C के अन्दर एलपीए प्रोलॉग विंडोज के लिए को एम्बेड करने की अनुमति देता है, सी #,c++, जावा, वीबी, डेल्फी, नेट, लुआ, पायथन और अन्य भाषाएं। यह समर्पित स्ट्रिंग डेटा-प्रकार का शोषण करता है जो एलपीए प्रोलॉग प्रदान करता है
  • लॉजिक सर्वर एपीआई सी, C++, जावा, वीबी, डेल्फी, .नेट और किसी भी भाषा/पर्यावरण में प्रोलॉग के विस्तार और एम्बेडिंग दोनों की अनुमति देता है जो .डीएलएल या .एसओ को कॉल कर सकता है। यह अमजी के लिए प्रयुक्त है! प्रोलॉग अमजी! प्रोलॉग + लॉजिक सर्वर लेकिन एपीआई विनिर्देश किसी भी कार्यान्वयन के लिए उपलब्ध कराया जा सकता है।
  • जेपीएल एक द्वि-दिशात्मक जावा प्रोलॉग ब्रिज है जो डिफ़ॉल्ट रूप से एसडब्ल्यूआई-प्रोलॉग के साथ आता है, जिससे जावा और प्रोलॉग एक दूसरे को (रिकर्सिवली) कॉल कर सकते हैं। यह अच्छा संगामिति समर्थन के लिए जाना जाता है और सक्रिय विकास के अधीन है।
  • इंटरप्रोलॉग, जावा मंच और प्रोलॉग के बीच एक प्रोग्रामिंग लाइब्रेरी ब्रिज, द्वि-दिशात्मक विधेय/विधि कॉलिंग के बीच कार्यान्वयन दोनों भाषाएँ है। जावा ऑब्जेक्ट्स को प्रोलॉग नियमो में मैप किया जा सकता है और इसके विपरीत। प्रोलॉग लेयर में लॉजिक प्रोसेसिंग को छोड़ते हुए जावा में ग्राफिकल यूजर इंटरफेस और अन्य कार्यक्षमता के विकास की अनुमति देता है। 2013 के लिए नियोजित एसडब्ल्यूआई-प्रोलॉग और वाईएपी (प्रोलॉग) के समर्थन के साथ एक्सएसबी का समर्थन करता है।
  • प्रोवा जावा, एजेंट मैसेजिंग और प्रतिक्रिया नियमों के साथ देशी सिंटैक्स एकीकरण प्रदान करता है। प्रोवा स्वयं को मिडलवेयर के लिए नियम-आधारित स्क्रिप्टिंग (आरबीएस) प्रणाली के रूप में रखता है। अनिवार्य प्रोग्रामिंग और घोषणात्मक प्रोग्रामिंग के संयोजन में भाषा नई जमीन बनाती है।
  • प्रोल जावा के लिए एक एम्बेड करने योग्य प्रोलॉग इंजन। इसमें एक छोटा आईडीई और कुछ पुस्तकालय सम्मिलित हैं।
  • जावा के लिए जीएनयू प्रोलॉग जावा लाइब्रेरी के रूप में आईएसओ प्रोलॉग का कार्यान्वयन है (जीएनयू.प्रोलॉग)
  • किआओ (प्रोग्रामिंग भाषा) C, C++, जावा और रिलेशनल डेटाबेस को इंटरफेस प्रदान करता है।
  • C#-प्रोलॉग एक प्रोलॉग दुभाषिया है जिसे (प्रबंधित) C# में लिखा गया है। C# प्रोग्राम में आसानी से एकीकृत किया जा सकता है। विशेषताएँ: विश्वसनीय और काफी तेज़ दुभाषिया, कमांड लाइन इंटरफ़ेस, विंडोज-इंटरफ़ेस, बिल्ट-इन डीसीजी, एक्सएमएल-विधेय, एसक्यूएल-विधेय विस्तारणीय। संपूर्ण स्रोत कोड उपलब्ध है, जिसमें एक पार्सर जनरेटर भी सम्मिलित है जिसका उपयोग विशेष उद्देश्य एक्सटेंशन जोड़ने के लिए किया जा सकता है।
  • पीएचपी के लिए वॉरेन सार मशीन पीएचपी 5.3 में एक प्रोलॉग कंपाइलर और दुभाषिया। एक पुस्तकालय जिसे स्टैंडअलोन या सिम्फनी 2.1 ढांचे के अन्दर उपयोग किया जा सकता है जिसे जावा में स्टीफ़न बुएचर का Buettcher's कार्य से अनुवादित किया गया था जिसे [यहाँ पाया जा सकता है] stefan.buettcher.org/cs/wam/index.html]
  • ट्यूप्रोलॉग वितरित अनुप्रयोगों और बुनियादी ढांचे के लिए एक हल्का प्रोलॉग प्रणाली है, सविचार एक न्यूनतम कोर के आसपास डिज़ाइन किया गया है, या तो वैधानिक रूप से या गतिशील रूप से विधेय के पुस्तकालयों को लोड / अनलोड करके कॉन्फ़िगर किया गया है। ट्यूप्रोलॉग मूल रूप से बहु-प्रतिमान प्रोग्रामिंग का समर्थन करता है, प्रोलॉग और मुख्यधारा की वस्तु-उन्मुख भाषाओं के बीच एक स्वच्छ, सहज एकीकरण मॉडल प्रदान करता है - जावा, ट्यूप्रोलॉग जावा संस्करण के लिए, और कोई भी .नेट- आधारित भाषा (C#, F#..), ट्यूप्रोलॉग के लिए। नेट संस्करण है।[73]


इतिहास

प्रोलॉग नाम फिलिप रसेल द्वारा संक्षिप्त नाम के रूप में चुना गया था प्रोग्राम एन लॉजिक (तर्क में प्रोग्रामिंग के लिए फ्रेंच भाषा)। यह 1972 के आसपास एलेन कॉलमेरॉयर द्वारा फिलिप रसेल के साथ बनाया गया था, जो रॉबर्ट कोवाल्स्की की हॉर्न क्लॉज की प्रक्रियात्मक व्याख्या पर आधारित था। यह 1960 के दशक के अंत और 1970 के दशक के प्रारंभ में उत्तरी अमेरिका में प्रचलित ज्ञान के प्रक्रियात्मक प्रतिनिधित्व के साथ एक घोषणात्मक ज्ञान प्रतिनिधित्व भाषा के रूप में तर्क के उपयोग को समेटने की इच्छा से प्रेरित था। रॉबर्ट कोवाल्स्की के अनुसार, पहला प्रोलॉग प्रणाली 1972 में कोलमेरौएर और फिलिप रसेल द्वारा विकसित किया गया था।[5] प्रोलॉग का पहला कार्यान्वयन जेरार्ड बट्टानी और हेनरी मेलोनी द्वारा फोरट्रान में लिखा गया एक दुभाषिया था। डेविड एच.डी. वारेन इस दुभाषिया को एडिनबर्ग विश्वविद्यालय ले गए, और वहां एक वैकल्पिक फ्रंट-एंड प्रयुक्त किया, जो अधिकांश आधुनिक कार्यान्वयनों द्वारा उपयोग किए जाने वाले "एडिनबर्ग प्रोलॉग" सिंटैक्स को परिभाषित करने के लिए आया था। वारेन ने फर्नांडो परेरा के सहयोग से प्रभावशाली दिसम्बर-10 प्रोलॉग का निर्माण करते हुए प्रोलॉग के लिए पहला संकलक भी प्रयुक्त किया। वॉरेन सार मशीन बनाने के लिए वॉरेन ने बाद में दिसम्बर-10 प्रोलॉग के पीछे के विचारों को सामान्यीकृत किया।

यूरोपीय एआई शोधकर्ताओं ने प्रोलॉग का समर्थन किया, जबकि अमेरिकियों ने लिस्प (प्रोग्रामिंग भाषा) का समर्थन किया, कथित तौर पर भाषाओं की खूबियों पर कई राष्ट्रवादी बहसें हुईं।[74] प्रोलॉग का अधिकांश आधुनिक विकास पांचवीं पीढ़ी के कंप्यूटर प्रणाली प्रोजेक्ट (एफजीसीएस) की प्रेरणा से आया, जिसने अपने पहले ऑपरेटिंग प्रणाली के लिए के एल1 नामक प्रोलॉग का एक संस्करण विकसित किया।

शुद्ध प्रोलॉग मूल रूप से फॉर्म के हॉर्न क्लॉज के साथ एक संकल्प (तर्क) प्रमेय प्रोवर के उपयोग तक ही सीमित था:

H:- B1, ..., Bn.

प्रमेय-प्रस्तावक का प्रयोग ऐसे खंडों को प्रक्रियाओं के रूप में मानता है:

H दिखाने हल करने के लिए B1 दिखाएं हल करें और Bn.

चूंकि, शुद्ध प्रोलॉग को जल्द ही विस्तारित कर दिया गया था, चूंकि, नकारात्मकता को विफलता के रूप में सम्मिलित करने के लिए, जिसमें फॉर्म की नकारात्मक स्थिति नहीं थी (Bi) इसी सकारात्मक स्थितियों बी को हल करने की प्रयास करने और असफल होने के द्वारा दिखाया गया हैi.

मूल टीम द्वारा प्रोलॉग के बाद के विस्तार ने कार्यान्वयन में बाधा तर्क प्रोग्रामिंग क्षमताओं को प्रस्तुत किया।

उद्योग में प्रयोग करें

वाटसन (कंप्यूटर) में प्रोलॉग का प्रयोग किया गया है। वाटसन आईबीएम के डीपक्यूए सॉफ्टवेयर और अपाचे यूआईएमए (असंरचित सूचना प्रबंधन वास्तुकला) ढांचे का उपयोग करता है। प्रणाली जावा, c++, और प्रोलॉग समेत विभिन्न भाषाओं में लिखा गया था, और वितरित कंप्यूटिंग प्रदान करने के लिए अपाचे हडूप ढांचे का उपयोग करके एसयूएसई लिनक्स एंटरप्राइज़ सर्वर 11 ऑपरेटिंग प्रणाली पर चलता है। प्रोलॉग का उपयोग प्राकृतिक भाषा पार्स ट्री पर पैटर्न मिलान के लिए किया जाता है। डेवलपर्स ने कहा है: हमें एक ऐसी भाषा की आवश्यकता है जिसमें हम पार्स ट्री और अन्य एनोटेशन (जैसे नामित इकाई पहचान परिणाम) पर पैटर्न मिलान नियमों को आसानी से व्यक्त कर सकें, और एक ऐसी तकनीक जो इन नियमों को बहुत कुशलता से निष्पादित कर सके। हमने पाया कि प्रोलॉग भाषा की सरलता और अभिव्यंजना के कारण उसके लिए आदर्श विकल्प था।[15] प्रोलॉग का उपयोग लो-कोड डेवलपमेंट प्लेटफॉर्म जीनएक्सस में किया जा रहा है, जो एआई के आसपास केंद्रित है। ओपन सोर्स ग्राफ डेटाबेस टर्मिनसडीबी प्रोलॉग में प्रयुक्त किया गया है।[75] टर्मिनसडीबी को सहयोगी रूप से ज्ञान का ग्राफ बनाने और क्यूरेट करने के लिए डिजाइन किया गया है।

यह भी देखें

संबंधित भाषाएं

  • गोडेल (प्रोग्रामिंग भाषा) | गोडेल भाषा समवर्ती बाधा तर्क प्रोग्रामिंग का दृढ़ता से टाइप किया गया कार्यान्वयन है। इसे SICStus प्रोलॉग पर बनाया गया है।
  • विज़ुअल प्रोलॉग, जिसे पहले पीडीसी प्रोलॉग और टर्बो प्रोलॉग के रूप में जाना जाता था, एक डेटा प्रकार ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग है। प्रोलॉग की ऑब्जेक्ट-ओरिएंटेड बोली, जो मानक प्रोलॉग से बहुत अलग है। टर्बो प्रोलॉग के रूप में, इसका विपणन बोरलैंड द्वारा किया गया था, लेकिन अब इसे डेनिश फर्म पीडीसी (प्रोलॉग डेवलपमेंट सेंटर) द्वारा विकसित और विपणन किया जाता है, जिसने मूल रूप से इसका उत्पादन किया था।
  • डेटालॉग प्रोलॉग का एक उपसमुच्चय है। यह उन संबंधों तक सीमित है जिन्हें स्तरीकृत किया जा सकता है और यौगिक नियमो की अनुमति नहीं देता है। प्रोलॉग के विपरीत, डेटालॉग ट्यूरिंग-पूर्ण नहीं है।
  • मरकरी (प्रोग्रामिंग भाषा) एक स्थिर, बहुरूपी प्रकार की प्रणाली के साथ-साथ एक विधा और नियतत्ववाद प्रणाली के साथ बड़े पैमाने पर सॉफ्टवेयर इंजीनियरिंग की ओर अग्रसर प्रोलॉग की एक शाखा है।
  • ग्राफटॉक अतिरिक्त वस्तु-उन्मुख गुणों के साथ वॉरेन की सार मशीन का एक मालिकाना कार्यान्वयन है।
  • कुछ मायनों में[which?] प्रोलॉग प्लानर (प्रोग्रामिंग भाषा) का एक सबसेट है। प्लानर के विचारों को बाद में वैज्ञानिक समुदाय रूपक में और विकसित किया गया।
  • एजेंटस्पीक बहु एजेंट प्रणाली में प्रोग्रामिंग एजेंट व्यवहार के लिए प्रोलॉग का एक रूप है।
  • Erlang (प्रोग्रामिंग भाषा) ने प्रोलॉग-आधारित कार्यान्वयन के साथ जीवन प्रारंभ किया और प्रोलॉग के एकीकरण-आधारित सिंटैक्स को बनाए रखता है।
  • Pilog PicoLisp के शीर्ष पर निर्मित एक घोषणात्मक भाषा है, जिसमें प्रोलॉग का श ब्दार्थ है, लेकिन लिस्प के सिंटैक्स का उपयोग करता है।

संदर्भ

  1. Clocksin, William F.; Mellish, Christopher S. (2003). Programming in Prolog. Berlin; New York: Springer-Verlag. ISBN 978-3-540-00678-7.
  2. Bratko, Ivan (2012). Prolog programming for artificial intelligence (4th ed.). Harlow, England; New York: Addison Wesley. ISBN 978-0-321-41746-6.
  3. Covington, Michael A. (1994). Natural language processing for Prolog programmers. Englewood Cliffs, N.J.: Prentice Hall. ISBN 978-0-13-629213-5.
  4. 4.0 4.1 Lloyd, J. W. (1984). Foundations of logic programming. Berlin: Springer-Verlag. ISBN 978-3-540-13299-8.
  5. 5.0 5.1 Kowalski, R. A. (1988). "The early years of logic programming" (PDF). Communications of the ACM. 31: 38. doi:10.1145/35043.35046. S2CID 12259230.
  6. Colmerauer, A.; Roussel, P. (1993). "The birth of Prolog" (PDF). ACM SIGPLAN Notices. 28 (3): 37. doi:10.1145/155360.155362.
  7. "PROLOG:a brief history". Retrieved 21 November 2021.
  8. See Logic programming § History.
  9. Stickel, M. E. (1988). "A prolog technology theorem prover: Implementation by an extended prolog compiler". Journal of Automated Reasoning. 4 (4): 353–380. CiteSeerX 10.1.1.47.3057. doi:10.1007/BF00297245. S2CID 14621218.
  10. Merritt, Dennis (1989). Building expert systems in Prolog. Berlin: Springer-Verlag. ISBN 978-0-387-97016-5.
  11. Felty, Amy. "A logic programming approach to implementing higher-order term rewriting." Extensions of Logic Programming (1992): 135-161.
  12. Kent D. Lee (19 January 2015). Foundations of Programming Languages. Springer. pp. 298–. ISBN 978-3-319-13314-0.
  13. Ute Schmid (21 August 2003). Inductive Synthesis of Functional Programs: Universal Planning, Folding of Finite Programs, and Schema Abstraction by Analogical Reasoning. Springer Science & Business Media. ISBN 978-3-540-40174-2.
  14. Fernando C. N. Pereira; Stuart M. Shieber (2005). Prolog and Natural Language Analysis. Microtome.
  15. 15.0 15.1 Adam Lally; Paul Fodor (31 March 2011). "Natural Language Processing With Prolog in the IBM Watson System". Association for Logic Programming. See also Watson (computer).
  16. ISO/IEC 13211-1:1995 Prolog, 6.3.7 Terms - double quoted list notation. International Organization for Standardization, Geneva.
  17. "Verify Type of a Term - SWI-Prolog".
  18. Carlsson, Mats (27 May 2014). SICStus Prolog User's Manual 4.3: Core reference documentation. BoD – Books on Demand. ISBN 9783735737441 – via Google Books.
  19. Covington, Michael A.; Bagnara, Roberto; O'Keefe, Richard A.; Wielemaker, Jan; Price, Simon (2011). "Coding guidelines for Prolog". Theory and Practice of Logic Programming. 12 (6): 889–927. arXiv:0911.2899. doi:10.1017/S1471068411000391. S2CID 438363.
  20. Kirschenbaum, M.; Sterling, L.S. (1993). "Applying Techniques to Skeletons". Constructing Logic Programs, (Ed. J.M.J. Jacquet): 27–140. CiteSeerX 10.1.1.56.7278.
  21. Sterling, Leon (2002). "Patterns for Prolog Programming". Computational Logic: Logic Programming and Beyond. Lecture Notes in Computer Science / Lecture Notes in Artificial Intelligence. Vol. 2407. pp. 17–26. doi:10.1007/3-540-45628-7_15. ISBN 978-3-540-43959-2.
  22. D. Barker-Plummer. Cliche programming in Prolog. In M. Bruynooghe, editor, Proc. Second Workshop on Meta-Programming in Logic, pages 247--256. Dept. of Comp. Sci., Katholieke Univ. Leuven, 1990.
  23. Gegg-harrison, T. S. (1995). Representing Logic Program Schemata in Prolog. Procs Twelfth International Conference on Logic Programming. pp. 467–481.
  24. Deville, Yves (1990). Logic programming: systematic program development. Wokingham, England: Addison-Wesley. ISBN 978-0-201-17576-9.
  25. 25.0 25.1 Naish, Lee (1996). Higher-order logic programming in Prolog (Report). Department of Computer Science, University of Melbourne. CiteSeerX 10.1.1.35.4505.
  26. "With regard to Prolog variables, variables only in the head are implicitly universally quantified, and those only in the body are implicitly existentially quantified". Retrieved 2013-05-04.
  27. 27.0 27.1 27.2 ISO/IEC 13211: Information technology — Programming languages — Prolog. International Organization for Standardization, Geneva.
  28. ISO/IEC 13211-2: Modules.
  29. 29.0 29.1 Moura, Paulo (August 2004), "Logtalk", Association of Logic Programming, 17 (3)
  30. 30.0 30.1 Shapiro, Ehud Y.; Sterling, Leon (1994). The Art of Prolog: Advanced Programming Techniques. Cambridge, Massachusetts: MIT Press. ISBN 978-0-262-19338-2.
  31. A. Ed-Dbali; Deransart, Pierre; L. Cervoni (1996). Prolog: the standard: reference manual. Berlin: Springer. ISBN 978-3-540-59304-1.
  32. "ISO/IEC 13211-1:1995/Cor 1:2007". ISO.
  33. "ISO/IEC 13211-1:1995/Cor 2:2012". ISO.
  34. "ISO/IEC 13211-1:1995/Cor 3:2017". ISO.
  35. "ISO/IEC JTC1 SC22 WG17".[permanent dead link]
  36. "X3J17 and the Prolog Standard". Archived from the original on 2009-08-23. Retrieved 2009-10-02.
  37. David H. D. Warren. "An abstract Prolog instruction set". Technical Note 309, SRI International, Menlo Park, CA, October 1983.
  38. Van Roy, P.; Despain, A. M. (1992). "High-performance logic programming with the Aquarius Prolog compiler". Computer. 25: 54–68. doi:10.1109/2.108055. S2CID 16447071.
  39. Graf, Peter (1995). Term indexing. Springer. ISBN 978-3-540-61040-3.
  40. Wise, Michael J.; Powers, David M. W. (1986). Indexing Prolog Clauses via Superimposed Code Words and Field Encoded Words. International Symposium on Logic Programming. pp. 203–210.
  41. Colomb, Robert M. (1991). "Enhancing unification in PROLOG through clause indexing". The Journal of Logic Programming. 10: 23–44. doi:10.1016/0743-1066(91)90004-9.
  42. Swift, T. (1999). "Tabling for non‐monotonic programming". Annals of Mathematics and Artificial Intelligence. 25 (3/4): 201–240. doi:10.1023/A:1018990308362. S2CID 16695800.
  43. Zhou, Neng-Fa; Sato, Taisuke (2003). "Efficient Fixpoint Computation in Linear Tabling" (PDF). Proceedings of the 5th ACM SIGPLAN International Conference on Principles and Practice of Declarative Programming: 275–283.
  44. Swift, T.; Warren, D. S. (2011). "XSB: Extending Prolog with Tabled Logic Programming". Theory and Practice of Logic Programming. 12 (1–2): 157–187. arXiv:1012.5123. doi:10.1017/S1471068411000500. S2CID 6153112.
  45. Abe, S.; Bandoh, T.; Yamaguchi, S.; Kurosawa, K.; Kiriyama, K. (1987). "High performance integrated Prolog processor IPP". Proceedings of the 14th annual international symposium on Computer architecture - ISCA '87. p. 100. doi:10.1145/30350.30362. ISBN 978-0818607769. S2CID 10283148.
  46. Robinson, Ian (1986). A Prolog processor based on a pattern matching memory device. Third International Conference on Logic Programming. Lecture Notes in Computer Science. Vol. 225. Springer. pp. 172–179. doi:10.1007/3-540-16492-8_73. ISBN 978-3-540-16492-0.
  47. Taki, K.; Nakajima, K.; Nakashima, H.; Ikeda, M. (1987). "Performance and architectural evaluation of the PSI machine". ACM SIGPLAN Notices. 22 (10): 128. doi:10.1145/36205.36195.
  48. Gupta, G.; Pontelli, E.; Ali, K. A. M.; Carlsson, M.; Hermenegildo, M. V. (2001). "Parallel execution of prolog programs: a survey". ACM Transactions on Programming Languages and Systems. 23 (4): 472. doi:10.1145/504083.504085. S2CID 2978041.
  49. "Statically Allocated Systems".
  50. "Software that takes games seriously". New Scientist. Reed Business Information. March 26, 1987. p. 34 – via Google Books.{{cite magazine}}: CS1 maint: url-status (link)
  51. 51.0 51.1 Logic programming for the real world. Zoltan Somogyi, Fergus Henderson, Thomas Conway, Richard O'Keefe. Proceedings of the ILPS'95 Postconference Workshop on Visions for the Future of Logic Programming.
  52. "FAQ: Prolog Resource Guide 1/2 [Monthly posting]Section - [1-8] The Prolog 1000 Database". www.faqs.org.
  53. Jan Wielemaker and Vıtor Santos Costa: Portability of Prolog programs: theory and case-studies. CICLOPS-WLPE Workshop 2010 Archived 2010-07-16 at the Wayback Machine.
  54. 54.0 54.1 Kiselyov, Oleg; Kameyama, Yukiyoshi (2014). Re-thinking Prolog. Proc. 31st meeting of the Japan Society for Software Science and Technology.
  55. Franzen, Torkel (1994), "Declarative vs procedural", Association of Logic Programming, 7 (3)
  56. Dantsin, Evgeny; Eiter, Thomas; Gottlob, Georg; Voronkov, Andrei (2001). "Complexity and Expressive Power of Logic Programming". ACM Computing Surveys. 33 (3): 374–425. CiteSeerX 10.1.1.616.6372. doi:10.1145/502807.502810. S2CID 518049.
  57. Mycroft, A.; O'Keefe, R. A. (1984). "A polymorphic type system for prolog". Artificial Intelligence. 23 (3): 295. doi:10.1016/0004-3702(84)90017-1.
  58. Pfenning, Frank (1992). Types in logic programming. Cambridge, Massachusetts: MIT Press. ISBN 978-0-262-16131-2.
  59. Schrijvers, Tom; Santos Costa, Vitor; Wielemaker, Jan; Demoen, Bart (2008). "Towards Typed Prolog". In Maria Garcia de la Banda; Enrico Pontelli (eds.). Logic programming : 24th international conference, ICLP 2008, Udine, Italy, December 9-13, 2008 : proceedings. Lecture Notes in Computer Science. Vol. 5366. pp. 693–697. doi:10.1007/978-3-540-89982-2_59. ISBN 9783540899822.
  60. O'Keefe, Richard A. (1990). The craft of Prolog. Cambridge, Massachusetts: MIT Press. ISBN 978-0-262-15039-2.
  61. Michael Covington; Roberto Bagnara; et al. (2010). "Coding guidelines for Prolog". arXiv:0911.2899 [cs.PL].
  62. Roy, P.; Demoen, B.; Willems, Y. D. (1987). "Improving the execution speed of compiled Prolog with modes, clause selection, and determinism". Tapsoft '87. Lecture Notes in Computer Science. Vol. 250. pp. 111. doi:10.1007/BFb0014976. ISBN 978-3-540-17611-4.
  63. Jaffar, J. (1994). "Constraint logic programming: a survey". The Journal of Logic Programming. 19–20: 503–581. doi:10.1016/0743-1066(94)90033-7.
  64. Colmerauer, Alain (1987). "Opening the Prolog III Universe". Byte. August.
  65. Wallace, M. (2002). "Constraint Logic Programming". Computational Logic: Logic Programming and Beyond. Lecture Notes in Computer Science. Vol. 2407. pp. 512–556. doi:10.1007/3-540-45628-7_19. ISBN 978-3540456285.
  66. "XPCE: the SWI-Prolog native GUI library". www.swi-prolog.org.
  67. "prolog-mpi". Apps.lumii.lv. Retrieved 2010-09-16.
  68. Ehud Shapiro. The family of concurrent logic programming languages ACM Computing Surveys. September 1989.
  69. Wielemaker, J.; Huang, Z.; Van Der Meij, L. (2008). "SWI-Prolog and the web" (PDF). Theory and Practice of Logic Programming. 8 (3): 363. doi:10.1017/S1471068407003237. S2CID 5404048.
  70. Jan Wielemaker and Michiel Hildebrand and Jacco van Ossenbruggen (2007), S. Heymans; A. Polleres; E. Ruckhaus; D. Pearse; G. Gupta (eds.), "Using {Prolog} as the fundament for applications on the semantic web" (PDF), Proceedings of the 2nd Workshop on Applications of Logic Programming and to the Web, Semantic Web and Semantic Web Services, CEUR Workshop Proceedings, Porto, Portugal: CEUR-WS.org, vol. 287, pp. 84–98
  71. Processing OWL2 Ontologies using Thea: An Application of Logic Programming. Vangelis Vassiliadis, Jan Wielemaker and Chris Mungall. Proceedings of the 5th International Workshop on OWL: Experiences and Directions (OWLED 2009), Chantilly, VA, United States, October 23–24, 2009
  72. Loke, S. W.; Davison, A. (2001). "Secure Prolog-based mobile code". Theory and Practice of Logic Programming. 1 (3): 321. arXiv:cs/0406012. CiteSeerX 10.1.1.58.6610. doi:10.1017/S1471068401001211. S2CID 11754347.
  73. "TuProlog @ UniBo". Archived from the original on 2019-03-17. Retrieved 2019-06-08.
  74. Pountain, Dick (October 1984). "POP and SNAP". BYTE. p. 381. Retrieved 23 October 2013.
  75. terminusdb/terminusdb, TerminusDB, 2020-12-13, retrieved 2020-12-15


अग्रिम पठन