में लक्ष्यों के एक समूह को संतुष्ट करना प्रोलॉग में मैं अक्सर एक टेम्पलेट (चर युक्त संरचना) प्रदान करके एक समस्या हल करता हूं और फिर उस पर बाधाओं का एक सेट संतुष्ट करता हूं। एक तुच्छ उदाहरण हो सकता है:प्रोलॉग
go(T) :-
T = [_, _, _],
member(cat, T),
member(dog, T),
member(mouse, T).
और व्यवहार में कमी के सेट किसी अन्य तरीके से उत्पन्न करने के बजाय है तय किया जा रहा है, और मैं एक पुनरावर्ती विधेय लिखने के बदले में प्रत्येक बाधा को संतुष्ट करने के लिए है:
go(T) :-
T = [_, _, _],
findall(A, animal(A), As),
% satisy member(A, T) for each A in As
fill_in_animals(T, As)
fill_in_animals(T, []).
fill_in_animals(T, [A|Rest]) :-
member(A, T),
fill_in_animals(T, Rest).
ध्यान दें कि मेरा प्रश्न सूची से संबंधित बाधाओं के बारे में नहीं है, और यहां तक कि बाधाओं के पैरामीटर को उपरोक्त उपयोग किए जाने वाले अपेक्षाकृत सरल सहायक अनुमान के लिए हमेशा एक सूची के रूप में आसानी से जेनरेट नहीं किया जा सकता है। अभ्यास में मुझे लगता है सहायक एक नहीं बल्कि कुरूप विधेय है कि मैं हर बार है, जो लिखना है:
- एक टेम्पलेट स्वीकार करता है, कई मापदंडों (और इसलिए उपयोगी मूल्यों के लिए खाके के चर बाइंडिंग के लिए) बाधा के लिए प्रयोग की जाने वाली, और एक चर जो यह इंगित करता है कि यह किस बाधा पर निर्भर है।
- इस पुनरावृत्ति में संतुष्ट करने के लिए एक बाधा उत्पन्न करता है, इसे टेम्पलेट पर लागू करता है।
- रिकर्सिव रूप से स्वयं को कॉल करता है ताकि शेष बाधाएं संतुष्ट हो सकें।
जो मैं खोज रहा हूं वह findall
, आदि के साथ एक अनुमान है, जो लक्ष्य के एक सेट को पूरा करेगा, एक के बाद एक। कुछ ऐसा:
% satisfyall(:Goal)
% backtracks on Goal but keeps all bindings from each fully satisfied goal.
satisfyall((animal(A), member(A, T)))
जो उत्तर मैं ढूंढ रहा हूं उसे इस फ़ॉर्म में नहीं होना चाहिए। वास्तव में एक लक्ष्य पर बैकट्रैकिंग और इसके परिणामस्वरूप बाइंडिंग के प्रत्येक सेट को बनाए रखने के बीच एक विरोधाभास हो सकता है।
मुझे आशा है कि मैंने अपनी समस्या समझाई है ताकि यह स्पष्ट रूप से स्पष्ट हो सके कि क्या मदद करेगा। (अगर मुझे नहीं पता है।) लंबे समय से चलने वाले प्रश्न के लिए अग्रिम क्षमा करें!
अद्यतन (2 साल बाद)
मैं इसे बाद में आज बाहर कोशिश करते हैं और मेरे सवाल का अद्यतन कर देंगे!
ध्यान दें कि मैंने कभी नहीं कहा था कि मैं उसी दिन प्रश्न को अपडेट करने के रूप में अपडेट करूंगा। ;-)
@CapelliC मुझे सही दिशा में चलाया गया है, और मैं एक पैटर्न जो बहुत अच्छी तरह से काम करने के लिए लगता है मिल गया है:
?- Gs = [member(red),member(blue)], T = [_,_], foreach(member(G, Gs), call(G, T)).
T = [red, blue] ;
T = [blue, red] ;
[lambda.pl] (http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/lambda.pl) मदद कर सकता है, लेकिन मुझे लगता है कि आप findall साथ जाना चाहिए/3 – CapelliC
क्या कोई विशेष कारण है कि लैम्ब्डा एसडब्ल्यूआई के साथ वितरित नहीं किया गया है? मैं 'use_module (लाइब्रेरी (लैम्ब्डा)) 'करने में सक्षम होना पसंद करूंगा! –
@DanielLyons: जब मैंने इस सवाल का जवाब देने की कोशिश की तो मुझे कुछ डाउनवोट मिला :) – CapelliC