2008-11-18 14 views
15

मैं वर्तमान में प्रोलॉग पर एक बहुत ही कम प्रोजेक्ट पर काम कर रहा हूं, और बस एक सूची में बनाए गए "फ़िल्टर" को लागू करने की कोशिश कर रहा हूं। मेरे पास फ़िल्टर है जिसे आप फ़िल्टर तैयार कर सकते हैं, लेकिन मैं इसे लागू नहीं कर सकता। यह बेहतर होगा अगर मैं स्पष्ट करता हूं:प्रोलॉग: एक सूची फ़िल्टरिंग?

filter(A, B) 

... कुछ शर्तों को पूरा होने पर 'सत्य' आउटपुट करता है।

filterList(A, [X, Y, Z]) 

... एक सूची है जो दूसरा तर्क है कि फिल्टर उत्पादन झूठी बनाने से सभी तत्व शामिल हैं आउटपुट। (इसलिए अगर फ़िल्टर (ए, एक्स) सच है, तो आउटपुट [वाई, जेड] है)।

मेरे पास "फ़िल्टर" फ़ंक्शन तैयार है, लेकिन अब मुझे दूसरे उदाहरण पर दिखाए गए एक सूची में इसे लागू करने की आवश्यकता है, जिसमें सभी तत्वों को छोड़कर फ़िल्टर पहली बार तर्क के साथ लागू होने पर सत्य लौटाता है।

तो, यदि फ़िल्टर एक साधारण ए == बी है, तो फ़ंक्शन ए [ए, बी, ए, सी, डी, ए] और आउटपुट [बी, सी, डी] प्राप्त करने वाला है, सभी को हटाकर स्पष्ट रूप से फ़िल्टर, जिसके लिए फ़िल्टर लागू होता है।

मुझे फ़ंक्शन की मूल संरचना में समस्या हो रही है, इसलिए अगर कोई इस तरह के फ़ंक्शन के लिए मूल रूपरेखा प्रदान कर सकता है तो यह बहुत मददगार होगा। मैंने जितनी ज्यादा हो सके अपनी स्थिति को सरल बना दिया है, इसलिए मैं जो कुछ भी कर सकता हूं उसे अपनी आवश्यकताओं के लिए प्रदान करने और संशोधित करने में सक्षम हो सकता हूं।

अग्रिम धन्यवाद!

उत्तर

11

आप Prolog में उच्च क्रम कार्यों के लिए खोज रहे हैं, तो आप निश्चित रूप से परामर्श करना चाहिए Naish (1995), एक बहुत अच्छा: तो, यहाँ मुझे एक जवाब अपने ही सवाल का, जैसा कि उम्मीद की एक बहुत छोटे से समारोह काम किया है प्रस्तुत करने है इस पर संसाधन।

filter/3 की उनकी परिभाषा निम्नलिखित (वह का उपयोग करता है अंतर-सूची अंकन, इसलिए filter/4 को परिभाषित करने के लिए पलायन) है:


filter(_,[],[]). 
filter(P, A0-As0, As) :- 
    (
     call(P, A0) -> As = A0-As1 
    ; 
     As = As1 
    ) 
    , filter(P, As0, As1). 

मैं आप इस विधेय बारे में प्रश्न हैं, मुझे टिप्पणी में कहें । पेपर को पढ़ने की भी अत्यधिक अनुशंसा की जाती है, यह भी map, foldr और compose की रक्षा करता है! ध्यान दें कि सीमाओं वह उल्लेख है (जैसे के कई हैं, उदाहरण के एक लापता call/3 या एक उच्च क्रम apply अब लागू नहीं है के लिए। SWI-Prolog =.. ऑपरेटर, जो उनकी चिंताओं के सभी के पते और मनमाने ढंग से एन-आदेश तर्क संभव बनाता है।

+1

पिटी नाइश अपने निष्कर्षों में आवेदन/लागू करने का प्रस्ताव करता है, लेकिन मुझे लगता है कि जाने का वर्तमान तरीका कॉल/एन का उपयोग करना है। आवेदन/3 बस कॉल/3 है। –

+2

चर्चा के लिए देखें क्यों नाइश संदर्भ विवादित है: http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/naish.html –

0

अच्छी तरह से आप जानते थे कि मैंने इसे अभी समझ लिया है।

filterList(_,[],R,R).   % Returns answer when the list is exhausted. 
filterList(L,[A|List],Temp,Res) :- 
    filterList(L,List,New,Res), % Recursive call, New is either the same list 
    ( filter(L,A),    % in case the filter outputs true, or the list 
     New = Temp 
    ; New = [A|Temp]   % plus the current element otherwise. 
    ). 
+1

यह संस्करण हमेशा किसी भी सूची के लिए सफल होता है। इरादा? – false

7

SWI-Prolog exclude/3 और अन्य ऐसे मेटा-विधेय प्रदान करता है आपका मूल समस्या इस तरह कोडित किया जा सकता है:।

are_identical(X, Y) :- 
    X == Y. 

filterList(A, In, Out) :- 
    exclude(are_identical(A), In, Out). 

प्रयोग उदाहरण:

?- filterList(A, [A, B, A, C, D, A], Out). 
Out = [B, C, D]. 
+0

में शामिल हैं (<(5), [3,4,5,6 , 7], के रूप में)। फ़िल्टर के रूप में काम करता है (<(5), [3,4,5,6,7], जैसा)। बहिष्कृत है इसके विपरीत यह फ़िल्टर (> = (5), [3,4,5,6,7], जैसा ही परिणाम देता है)। – joeblog

3

नहीं है फ़िल्टर फ़ंक्शंस के साथ एक अंतर्निहित समस्या जो फ़िल्टरिंग के लिए मानदंड के रूप में भविष्यवाणी की सफलता या विफलता लेती है: परिणामस्वरूप प्रोग्राम अब एक शुद्ध मोनोटोनिक प्रोग्राम नहीं है। इसलिए यह सभी घोषणात्मक गुणों को खो देता है — एकमात्र अर्थ यह है कि एक प्रक्रियात्मक चरण-दर-चरण व्याख्या है।यहाँ if_/3 का उपयोग कर छानने का एक शुद्ध, reified संस्करण है:

tfilter(_CT_2, [], []). 
tfilter(CT_2, [E|Es], Fs0) :- 
    if_(call(CT_2,E), Fs0 = [E|Fs], Fs0 = Fs), 
    tfilter(CT_2, Es, Fs). 

पहला तर्क इस प्रकार एक बंद/निरंतरता है कि दो और तर्क प्राप्त होगा: तत्व और जिसके परिणामस्वरूप सच्चाई मूल्य।

=(X,X,true). 
=(X,Y,false) :- dif(X,Y). 

अब, परिणाम सटीक रहते हैं:

| ?- tfilter(=(X),[A,B],Xs). 
B = A, 
X = A, 
Xs = [A,A] ? ; 
X = A, 
Xs = [A], 
dif(A,B) ? ; 
X = B, 
Xs = [B], 
dif(B,A) ? ; 
Xs = [], 
dif(X,A), 
dif(X,B) ? ; 
no 

चार संभावनाएँ कैसे दो तत्वों की सूची X के बराबर होने का मापदंड द्वारा फ़िल्टर किया जा सकता है। प्रत्येक तत्व बराबर या अलग हो सकता है।

इस दृष्टिकोण का नकारात्मक पक्ष यह है कि किसी को सभी मानदंडों के संशोधित संस्करण प्रदान करना होगा।

0

मैं एक ऐसे देश // Obtengo लॉस adultos डे संयुक्त राष्ट्र पाइस, देश = पाइस, लोग = Personas, व्यक्ति = ऊना सोला व्यक्तित्व

habitants(USA, [juan, pedro, david]) 

adults(Adults, Country) :- 
    findall(Person, (habitants(Country,People), member(People, Person), adult(Person)), Adults) 

यह एक फिल्टर है में prolog // असी तों के वयस्कों मिल un filter en prolog

संबंधित मुद्दे