2011-11-11 22 views
5

संभव डुप्लिकेट:
Prolog delete: doesn't delete all elements that unify with ElementProlog में एकीकरण के बिना एक सूची के सभी सदस्यों को हटाया जा रहा है

Prolog में अगर आप इस बारे में:

delete([(1,1),(1,2),(1,1),(3,4)],(1,_),L). 

परिणाम हो जाएगा:

L = [ (1, 2), (3, 4)]. 

सामान्य क्या है क्योंकि _ चर पहले तत्व में 1 के साथ बांधता है और यह (1,1) के आगे के तत्वों की खोज करता है और उन्हें हटा देता है।

क्या इस एकीकरण को फॉर्म (1, _) के सभी सदस्यों को होने और हटाने से रोकने का कोई तरीका है। उस स्थिति में परिणाम होना चाहिए: एल = [(3, 4)]।

उत्तर

3
delete_pattern([], _, []). 
delete_pattern([H|T], P, O) :- 
    ( H \= P 
    -> O = [H|O1], 
     delete_pattern(T, P, O1) 
    ; delete_pattern(T, P, O)). 

आप छानने कि ==/2 या [email protected]=/2 के रूप में थोड़ा अलग अर्थ विज्ञान में परिणाम होगा के लिए अन्य विधेय का उपयोग करना चाहते हो सकता है।

+0

काम करता है, लेकिन ब्रेक सूची आइटम अपर्याप्त समय में instantiated कर रहे हैं 'delete_pattern/3' चलाया जाता है। – repeat

3

यहां एक और संस्करण है। वास्तव में, एक शुद्ध एक:

list_el_deleted([], _, []). 
list_el_deleted([X|Xs], X, Ys) :- 
    list_el_deleted(Xs, X, Ys). 
list_el_deleted([X|Xs], E, [X|Ys]) :- 
    dif(X,E), 
    list_el_deleted(Xs, E, Ys). 

आपकी क्वेरी पर यह कोशिश कर रहा है आपकी समस्या बयान में अस्पष्टता के उन वास्तविक स्रोतों का पता चलता है:

?- list_el_deleted([(1,1),(1,2),(1,1),(3,4)],(1,X),L). 
X = 1, 
L = [ (1, 2), (3, 4)] ; 
X = 2, 
L = [ (1, 1), (1, 1), (3, 4)] ; 
L = [ (1, 1), (1, 2), (1, 1), (3, 4)], 
dif(X, 1), 
dif(X, 2), 
dif(X, 1). 

तो यह सब क्या X वास्तव में है पर निर्भर करता है: 1, 2, या कुछ और। ध्यान दें कि पिछले संस्करणों यहाँ पर चर्चा की वास्तविक इन्स्टेन्शियशन जो और अधिक कठिन बना देता है तर्क पर निर्भर करते हैं:

सिद्धांत रूप में
?- delete([a],X, Xs), X = c. 
false. 

?- X = c, delete([a],X, Xs). 
X = c, 
Xs = [a]. 
+1

@repeat: अपना समाधान [यहां] रखें (http://stackoverflow.com/questions/8100586/prolog-delete-doesnt-delete-all-elements-that-unify-with-element#)। – false