मैं प्रोलॉग में एक नौसिखिया हूं और मेरे पास रिकर्सन का उपयोग करके दो सूचियों में से दो टुपल्स हैं। उदाहरण के लिए, func ([1, 2, 3], [4, 5, 6]) को आउटपुट [(1, 4), (1,5), (1,6), (2, 4), (2 , 5), (2, 6), (3, 4), (3,5), (3, 6)]। मेरे पास निम्न कोड है:

func([],_,[]).
func([X|T1],Y,[Z|W]):-
    match(X,Y,Z),
    func(T1,Y,W).

match(X,[Y],[(X,Y)]).
match(X,[Y|T],[(X,Y)|Z]) :-
    match(X,T,Z).

लेकिन func([1,2,3],[4,5,6],X) के लिए मेरा आउटपुट X = [[(1, 4), (1, 5), (1, 6)], [( 2, 4), (2, 5), (2, 6)], [(3, 4), (3, 5), (3, 6)]]।

मैं अपने आउटपुट के बीच में अतिरिक्त वर्ग कोष्ठक से कैसे छुटकारा पा सकता हूं? मैंने अपने दोनों कार्यों में कोष्ठक और कोष्ठक के साथ खेलने की कोशिश की है, लेकिन मैं इसका पता नहीं लगा सकता।

1
StrickBan 10 अप्रैल 2020, 01:52

1 उत्तर

सबसे बढ़िया उत्तर

findall/3 मानक विधेय और member/2 वास्तविक मानक विधेय का उपयोग करना:

| ?- findall(X-Y, (member(X,[1,2,3]), member(Y,[4,5,6])), Pairs).

Pairs = [1-4,1-5,1-6,2-4,2-5,2-6,3-4,3-5,3-6]
yes

इस समाधान को समझने के लिए, देखें कि, X के प्रत्येक मान के लिए, हम Y के सभी मानों को पीछे करके गणना करते हैं। अर्थात। जब बैकट्रैकिंग (जैसा कि इसके दूसरे तर्क के सभी समाधानों की एक सूची बनाने के लिए findall/3 विधेय द्वारा किया गया है), हम अंतिम विकल्प-बिंदु (member(Y,[4,5,6]) लक्ष्य) के लिए सभी समाधानों को वापस करने से पहले समाप्त कर देते हैं। पिछला विकल्प-बिंदु (member(X,[1,2,3]) लक्ष्य)। इसे कालानुक्रमिक बैकट्रैकिंग के रूप में जाना जाता है और यह प्रोलॉग की परिभाषित विशेषताओं में से एक है।

ध्यान दें कि मैंने (X,Y) के बजाय एक जोड़ी के लिए सामान्य प्रोलॉग प्रतिनिधित्व X-Y का उपयोग किया था, जो n-tuples के निर्माण के लिए अनुशंसित समाधान नहीं है क्योंकि यह केवल अच्छी तरह से काम करता है तत्वों के जोड़े।

1
Paulo Moura 9 अप्रैल 2020, 23:19