- Prolog clause और term-केंद्रित डेटा मॉडल से program बनाता है, इसलिए छोटी grammar से भी गणना-योग्य relations व्यक्त किए जा सकते हैं
- declarative तरीका execution procedure के बजाय क्या सत्य है यह लिखता है, इसलिए उसी relation को calculation, generation और query—तीनों में इस्तेमाल किया जा सकता है
- pure Prolog Horn clause और resolution पर आधारित है, और constraints जोड़ने व clauses जोड़ने का solution set पर प्रभाव logical रूप से अनुमानित किया जा सकता है
- program खुद Prolog term होता है, इसलिए दूसरे programs को पढ़ना, analyze करना और transform करना आसान है; compile time rewriting से domain-specific languages भी बनाई जा सकती हैं
- runtime dynamism और search, unification, constraint propagation जैसे implicit mechanisms के कारण यह language processing, databases, verification और optimization तक व्यापक रूप से उपयोगी है
clauses और terms से बनी एक छोटी language
- Prolog का सारा data Prolog term के रूप में व्यक्त होता है
- मुख्य language element एक clause है, जिसका basic form
Head :- Body. है
- इसका अर्थ है: अगर Body सत्य है, तो Head सत्य है
- infix operator
(:-)/2 दाईं ओर से बाईं ओर जाने वाले arrow ← को दर्शाता है
- अगर Head हमेशा सत्य है, तो
:- Body को छोड़ा जा सकता है
- उपयोगी पहला Prolog program लिखने के लिए यही structure पर्याप्त है
- सभी ज्ञात computations ऐसे clauses से वर्णित किए जा सकते हैं, इसलिए Prolog एक Turing complete language है
- Turing machine को current state और tape head के नीचे के symbol आदि से next state तक जाने वाले relation को clauses में वर्णित करके implement किया जा सकता है
- उदाहरण implementation turing.pl में है
Declarative programming और relation-केंद्रित सोच
- Prolog एक declarative language है, जो solution खोजने के तरीके के बजाय रुचि वाले solutions के बारे में क्या सत्य है यह व्यक्त करती है
- यह प्रकृति concise, स्पष्ट और सामान्य specifications को संभव बनाती है
- list और length का relation इस तरह वर्णित किया जा सकता है
list_length([], 0).
list_length([_|Ls], N) :-
N #> 0,
N #= N0 + 1,
list_length(Ls, N0).
- कुछ Prolog systems में declarative integer arithmetic इस्तेमाल करने के लिए अलग library शामिल करनी पड़ती है
- यह definition declaratively इस तरह पढ़ी जा सकती है
- empty list
[] की length 0 है
- अगर
Ls की length N0 है और N, N0 + 1 है, तो [_|Ls] की length N है, और यह relation तभी सत्य है जब N, 0 से बड़ा हो
- उसी relation को कई modes में इस्तेमाल किया जा सकता है
list_length("abc", L) L = 3 लौटाता है
list_length(Ls, 3) length 3 वाली list form Ls = [_A,_B,_C] खोजता है
list_length(Ls, L) empty list से शुरू करके बढ़ती length वाली lists तक सामान्य answers सूचीबद्ध करता है
- Prolog आम तौर पर backtracking से सभी answers report करता है
length/2 Prologue for Prolog draft में शामिल है, और लगभग सभी Prolog implementations में इसी अर्थ का built-in predicate उपलब्ध है
Logic programming के रूप में Prolog
- declarative languages की category में functional programming languages और logic programming languages शामिल हैं
- function, relation का special case है, और functional programming को logic programming का सीमित रूप माना जा सकता है
- Prolog की जड़ें logic में हैं
- pure Prolog program Horn clause set से बना होता है
- execution को resolution का special case माना जा सकता है
- formal logic से connection के कारण program की logical properties पर आधारित declarative debugging लागू की जा सकती है
- constraints जोड़ने पर solution set अधिकतम घटता है
- clauses जोड़ने पर solution set अधिकतम फैलता है
- pure Prolog programs की इस property को monotonicity कहा जाता है
- Ulrich Neumerkel का GUPU system ऐसे ideas के application का उदाहरण है
programs को data की तरह treat करने वाली homoiconic property
- Prolog program एक valid Prolog term भी होता है
- इस property के कारण Prolog programs के लिए दूसरे Prolog programs को analyze, transform और interpret करना आसान होता है
- built-in predicate
read/1 से Prolog term पढ़ा जा सकता है, इसलिए Prolog clause भी पढ़ा जा सकता है
- Prolog में compile time पर program को rewrite करने वाला शक्तिशाली macro mechanism है
- इससे domain-specific languages implement की जा सकती हैं, जिनसे किसी task को अधिक natural तरीके से हल किया जा सके
list_length(Ls,N) और N#>0 notation में अलग दिखते हैं, लेकिन Prolog के prefix, infix, postfix operators के कारण ये अधिक readable form में व्यक्त किए गए हैं
- उदाहरण के लिए Prolog term
+(a,b) को operator notation में a+b लिखा जा सकता है
- abstract syntax uniform है, इसलिए लिखने के तरीके से स्वतंत्र होकर सभी Prolog terms पढ़े और process किए जा सकते हैं
- किसी खास use case के लिए custom operators dynamically define किए जा सकते हैं
Runtime dynamism और extensibility
- Prolog programs को runtime पर आसानी से generate, call और modify किया जा सकता है
- यह property expressiveness बढ़ाती है और दूसरे predicates को arguments के रूप में लेने वाले higher-order predicates implement करना संभव बनाती है
- adaptive parsing जैसी बहुत dynamic techniques भी implement की जा सकती हैं
- Prolog ऐसे programs लिखने के लिए उपयुक्त है जो दूसरे programmers या सामान्य users द्वारा दिए गए custom rules से extend होते हैं
- pure Prolog के लिए interpreter Prolog code की दो lines में define किया जा सकता है
- संबंधित सामग्री A Couple of Meta-interpreters in Prolog में दी गई है
विविध उपयोग-क्षेत्र और implicit mechanisms
- Prolog की relational प्रकृति programs को flexible और general बनाती है
- यह प्रकृति language processing और databases में knowledge representation में महत्वपूर्ण भूमिका निभाती है
- आधुनिक Prolog systems सरल logic puzzles से लेकर बड़े applications तक के लिए जरूरी capabilities देते हैं
- Prolog की versatility और ताकत search, unification, argument indexing, constraint propagation जैसे implicit mechanisms में निहित है
- developers इन mechanisms का उपयोग करके कई tasks Prolog engine को सौंप सकते हैं
1 टिप्पणियां
Hacker News की रायें
यहां व्यक्त भावना से मैं लगभग पूरी तरह सहमत हूं। यूनिवर्सिटी के तीन AI कोर्स में हमने Prolog इस्तेमाल किया था, और लगभग पूरी "AI: A Modern Approach" के साथ Prolog programming भी कवर की थी; सच में यह सोचने का तरीका मरोड़ देने वाला अनुभव था
Prolog के ढंग से फिर से सोचने के लिए हमेशा warm-up चाहिए होता था, और उस semester में मैं दूसरी languages में भी बेहद Prolog-जैसा spaghetti code लिखने लगा था। उस समय सबसे बड़ी कमी यह थी कि दूसरी चीजों के साथ interoperability मुश्किल थी; या तो JVM के अंदर Prolog डालना पड़ता, या कम features वाली implementation इस्तेमाल करनी पड़ती, या C bindings पर निर्भर रहना पड़ता। खास कामों, विशेषकर constraint satisfaction problems, के लिए यह शानदार है, लेकिन user interface या file system access जैसी चीजें मिलते ही मुझे यह फिट नहीं लगा। तब SWI भी पीछे था और Sicstus जैसे proprietary solutions इस्तेमाल होते थे; हाल में देखा तो SWI proprietary implementations के बराबर आ चुका है, इसलिए आज होता तो शायद SWI चुनता। Prolog exam यूनिवर्सिटी में सबसे डरावना था—60 मिनट की live coding में 3 सवाल और उसके बाद oral exam—लेकिन आसान सवाल पर 40 मिनट लगाकर बाकी दोनों कुछ ही मिनटों में हल कर दिए और ठीक से निकल गया। अगले course में game-playing agent implement करके tournament में भिड़ाने वाला assignment मजेदार था, और "The Art of Prolog" व "The Craft of Prolog" अब तक पढ़ी programming books में सबसे बेहतरीन में हैं
The Craft of Prolog भी शानदार है, लेकिन पुराने Prolog system programming पर बहुत ज्यादा केंद्रित होने के कारण आज कुछ chapters पुराने लगते हैं। Prolog के कई ideas answer set programming और Datalog में जिंदा हैं, और Datalog modern static analyzers बनाने के लिए बेहतरीन है: https://arxiv.org/abs/2012.10086
अचानक सोचता हूं कि chatbots Prolog को कैसे handle करेंगे। क्या उन्होंने इसे पर्याप्त देखा होगा? क्या वे उस तरह reasoning कर सकते हैं?
Prolog कमाल का है, और एक अजनबी programming paradigm का अनुभव लेने के मजे भर के लिए भी सीखने लायक है। कई concepts बिल्कुल अलग तरीके से व्यक्त होते हैं, और paradigm समझ में आ जाए तो उलटे बहुत सरल लगने लगता है
उदाहरण के लिए Prolog में आम तौर पर collections को सीधे manipulate नहीं करते; collection के items क्या हैं, इसकी जानकारी देते हैं और implementation को खुद निकालने देते हैं। dependency tree बनाना भी सिर्फ 3 rules से संभव है: entities क्या हैं, entity X और Y का relationship कैसे तय करना है, और उसे कैसे represent करना है। लेकिन यह मुश्किल है, इसलिए लोगों को इसे सीखने या इस्तेमाल करने के लिए मनाना कठिन है, और मुझे अब तक इसे दूसरे apps में smoothly integrate करने का तरीका नहीं मिला। जानता हूं FFI एक option है, पर यह production-ready है, यह बात मुझे convince नहीं करती। पिछले कुछ महीनों में अधिक “production” के करीब Prolog alternatives ढूंढे, लेकिन LispWorks और Franz Allegro CL बहुत महंगे थे और integration-friendly नहीं लगे। अगर किसी ने modern software में Prolog को अच्छी तरह integrate किया हो तो सच में जानना चाहूंगा। Mac पर XPCE काम नहीं करता, इसलिए GUI solution भी ढूंढ रहा हूं। online notebook के तौर पर Swish भी देखने लायक है: https://swish.swi-prolog.org
सुना है अब इसे हटा दिया गया है, इसलिए यह “modern” example नहीं है, लेकिन Prolog apply करने का वाकई सुंदर उदाहरण है। https://news.ycombinator.com/item?id=36821871 से https://web.archive.org/web/20030218034509/http://www.resear... तक पढ़ना काफी worthwhile है। संबंधित link: https://news.ycombinator.com/item?id=14046420
दोनों काफी अच्छी तरह काम करते थे, लेकिन use cases सीमित थे। यूनिवर्सिटी में Prolog इस्तेमाल करने का अनुभव मजेदार था, लेकिन अगर problem मूल रूप से Prolog-shaped न हो तो मैं इसे इस्तेमाल नहीं करना चाहूंगा। जैसे ही थोड़ा भी complex कुछ implement करना शुरू करते हैं, abstractions जगह-जगह leak होने लगती हैं, और language के फायदे लेने की बजाय backtracking algorithm से लड़ने जैसा ज्यादा महसूस होता है
Racklog, Prolog-style logic programming को Racket में embed करता है, और “embedding” का मतलब है कि आप Racket नहीं खोते। Prolog-style code snippets और सामान्य Racket code को साथ-साथ लिख सकते हैं। इसमें meta logic और second-order “set” predicates सहित Prolog की ज्यादातर सुविधाएं हैं, सिर्फ वे features छोड़े गए हैं जिन्हें Racket subexpressions से ज्यादा आसान और efficient तरीके से किया जा सकता है। https://docs.racket-lang.org/racklog/index.html Racket में GUI भी है, और सच कहें तो लगभग वह सब कुछ है जिसकी जरूरत पड़ती है
CUE मौजूदा workflow में कहीं ज्यादा आसानी से डाला जा सकता है, इसलिए logic programming के फायदे को practical बनाने के लिए अच्छा है। https://cuelang.org | https://cuetorials.com
कई वर्षों तक C++ में supply chain optimization software बनाते हुए ILOG constraint propagation software, यानी अब IBM के स्वामित्व वाले Solver, का इस्तेमाल किया था। उस समय BinProlog पर भी विचार किया था; उसमें range propagation built-in था, native x86 में compile होता था, और FFI interoperability भी ठीक-ठाक थी
फिर भी लगता है कि आखिरकार वह SWI Prolog और GNU toolchain के सामने पीछे रह गया। GUI को शायद बिल्कुल अलग विशेषज्ञता वाला क्षेत्र मानना चाहिए; हमने अपना C++ canvas rendering engine और “4D” या “Fourth Dimension” नाम का एक बेहद खराब integrated 4GL development tool इस्तेमाल किया था। https://www.tomshw.it/data/images/2/0/4/3/infor-advanced-sch...
Mark Tarver की Shen language में Prolog का पूरा implementation शामिल है: https://shenlanguage.org/SD/Prolog.html
The Book of Shen में इसका संबंधित chapter भी है: https://shenlanguage.org/TBoS/tbos_359.html Tarver ने logic programming पर software के साथ दो किताबें भी लिखी हैं। Logic, Proof and Computation: https://shenlanguage.org/lpc.html Programming the Logic Lab: https://shenlanguage.org/logiclab.html
pattern matching, optional type checking, और built-in Prolog हैरान करने वाले हैं। इसके creator को उसके diplomatic attitude की वजह से व्यापक community से कुछ हद तक बाहर कर दिया गया, लेकिन वह प्रतिभाशाली है और adoption niche तथा cutting-edge तक सीमित रहा। अगर Mozilla जैसी कोई organization पीछे होती, तो शायद इसकी mainstream appeal कहीं ज्यादा होती। @deech की talks अब पुरानी हैं, लेकिन अब भी शानदार और meaningful हैं: https://www.youtube.com/watch?v=lMcRBdSdO_U, https://www.youtube.com/watch?v=BUJNyHAeAc8 हालांकि मैं APL/J/BQN का enthusiast हूं, इसलिए इसे उसी हिसाब से लें
याद है कि लगभग 25 साल पहले AI + computer science degree course में Prolog सीखा था। natural language processing module में इसका खूब इस्तेमाल हुआ था
शुरुआत में यह frustrating और irritating लगा, लेकिन आदत पड़ने पर unexpectedly मजेदार हो गया; और iteration के लिए recursion ही एकमात्र तरीका था, इसलिए recursion introduction के रूप में भी यह शानदार था
university में हमने Prolog मुख्यतः उन mathematicians से सीखा जो लगभग इसी तरह की languages इस्तेमाल करते थे, और उनके लिए Prolog सोचने का एक बहुत natural तरीका था। इसके उलट, जिन students ने mostly procedural languages ही इस्तेमाल की थीं, उनके लिए यह confusing और frustrating था, और हर कोई Prolog को दूसरी languages की तरह लिखने की कोशिश में उलझ जाता था। Prolog इस्तेमाल करने वाले तीसरे या चौथे course में, उसके पीछे के algorithms पढ़ने के बाद ही सही तरीके से इस्तेमाल करना समझ में आया। बाद में मैंने एक undergraduate student की मदद की जो Prolog से जूझ रहा था; core बात यह थी कि Prolog को existing languages की तरह चलाने की कोशिश करने के बजाय problem-solving thinking को Prolog की दुनिया के हिसाब से बदलना था। काफी देर बात करने के बाद सचमुच enlightenment वाला moment आया, और उसने assignment बहुत अच्छे से पूरा किया
लेकिन जब नया paradigm दिमाग में सही से fit हो गया, तो मैं इसे सचमुच पसंद करने लगा। सिर्फ उस realization moment के लिए भी वह class लेना पूरी तरह worthwhile था
दूसरे comments Prolog को broadly discuss कर रहे हैं, लेकिन मैं कहना चाहूंगा कि The Power of Prolog काफी बेहतरीन tutorial series है
videos भी देखने लायक हैं, और Markus viewers और readers की रुचि अच्छी तरह बनाए रखता है
इसी video की वजह से मैं Prolog को programming की एक वर्तमान और progressive movement के रूप में स्वीकार कर पाया
Prolog एक खूबसूरत language है। mathematical reasoning, rule-based reasoning आदि के लिए मैंने दसियों हजार lines लिखी हैं; ऐसे domains के लिए यह बिल्कुल perfect fit है और इस पर काम करना बेहद मजेदार है
दूसरे kinds के applications के लिए दो problems हैं। पहला, paradigm इतना अलग है कि यह libraries और दूसरी languages के साथ अच्छी तरह fit नहीं बैठता। दूसरा, proper GUI बनाना लगभग impossible है, क्योंकि वह भी इस paradigm से मेल नहीं खाता
आम तौर पर Prolog side पर external interface ऐसा predicate जैसा दिखता है जिसके सभी arguments grounded होते हैं, और external side पर Prolog से वैसा interact किया जाता है जैसे SQL database से करते हैं। query भेजना, query को decompose करना, और ज्यादा solutions मांगना या backtracking drive करना—कुछ इसी तरह। यह कहा जा सकता है कि ऐसा interaction “interesting” नहीं है, लेकिन ऐसा इसलिए होता है क्योंकि libraries वास्तव में Prolog की उपयोगी capabilities का लाभ नहीं उठातीं। चाहें तो ज्यादा thick interoperability layer बनाई जा सकती है, और कई library functions को Prolog side पर एक single predicate interface में बांधकर arguments के instantiation mode के आधार पर कोई specific subroutine call करवाई जा सकती है। लेकिन यह C library को Python जैसी object-oriented language में expose करते समय कई C functions को property accessors या data structure के methods की तरह बांधने से बहुत अलग नहीं है
data analysis में Prolog का actively इस्तेमाल कर रहा हूं। शुरुआत में खुद को हर संभव चीज Prolog में करने के लिए push करने वाला phase जरूरी होता है, ताकि यह समझ आ सके कि questions को symbolic problem में कैसे बदला जाए
Prolog में scientific computing और string manipulation का support कमजोर है, इसलिए ऐसा है। उस पड़ाव से आगे निकलने पर Prolog वाला समाधान अक्सर अगले सबसे अच्छे विकल्प से ज़्यादा elegant होता है। साथ ही, यह logical paradigm है, इसलिए proof by negation + unification = logic programming कैसे बनता है, इसे समझने में समय लगाना क़ीमती है। मैंने जितनी programming languages सीखी हैं, उनमें यह अब तक मेरी सोच का दायरा सबसे ज़्यादा बढ़ाने वाली language रही है
Standard Prolog में regex built-in नहीं है, लेकिन popular implementations आम तौर पर इसके लिए libraries देती हैं। अगर बहुत सारा string work करना हो और C व Prolog में से चुनना हो, तो मैं निश्चित रूप से Prolog चुनूंगा। Python और Prolog के बीच चुनाव काम पर निर्भर करेगा
खैर, साइट शानदार है और अच्छा लगा कि यह विषय फिर सामने आया
मैंने पहले Java में solver लिखा था, इसलिए उस code को Prolog में port करने की कोशिश की, लेकिन वह बिल्कुल काम नहीं आया। अंत में मैंने फिर से शुरू किया और यह check करने के लिए सरल Prolog code लिखा कि Sudoku valid है या नहीं, और फिर महसूस किया कि उन predicates को run करने पर Sudoku solve भी हो सकता है। इस तरह मैंने 10 lines से कम में solver पूरा कर लिया। वह सचमुच Eureka moment था, और Prolog बहुत powerful है, लेकिन real-world काम में इसे नाइंसाफ़ी से कम इस्तेमाल किया जाता है। सौभाग्य से मुझे Datalog और OWL पर काम करने का मौका मिला था