2011-02-13 44 views
1

如何編寫只包含數字和字母的列表中的數字的Prolog代碼?例如,如果我有[a,b,7,d,3,e,f,5],我想寫代碼給我[7,3,5]。 在此先感謝。prolog:logic programming

+0

http://stackoverflow.com/questions/15313626/write-a-prolog-program-displaying-an-mn-grid-of-asterisk – user2152012 2013-03-09 18:51:54

回答

2

你必須編寫一個函數來給你一個列表。在Prolog中不存在返回語句,但您也可以使用參數來指定out事物。

% The second parameter will be our OUT parameter. 
% It can be anything that we specify. 

% Return an empty list, because our input is empty as well 
numFilter([],[]). 

% return a list with H and what will come out recursively 
numFilter([H|T],[H|T2]) :- number(H), numFilter(T,T2). 

% return a list with what will come out recursively. H is not a number 
numFilter([H|T],T2) :- not(number(H)), numFilter(T,T2). 

因此,您可以爲每種可能發生在您身上的輸入指定規則。我們有一個用於空列表,我們有兩個用於至少有一個元素的列表。第一個元素將被檢查,我們繼續遞歸。

我們可以調用這個函數,像這樣的電話:

numFilter([a,b,7,d,3,e,f,5],A). 

的A是將由序言在運行時填寫的變量。 number: 1prolog dictionary中的函數。

因此,對於這些類型的任務,您需要爲列表遞歸。請記住。

+0

好的。謝謝,如果列表是一個嵌套列表,比如讓我們說你喜歡這個([a,b,1,[2,[c,3]],d],1,A)得到這個[2,3]。 – guest 2011-02-15 02:07:05

+0

@guest然後,您將需要另一個檢查H是否爲列表的規則。如果是這樣,你也可以在H上執行`numFilter`並追加結果。例如:`numFilter([[H | Tinner] | T],[T2 | T3]): - numFilter([H | Tinner],T2),numFilter(T,T3)。'現在我們知道它是一個列表至少有一個元素。 – Marnix 2011-02-15 13:10:48

3

它很容易把這個成的findall:

numList(ListIn, Nums) :- 
    findall(H, (member(H, ListIn), number(H)), Nums). 

查詢有:

?- numList([a,b,7,d,3,e,f,5], Nums). 
Nums = [7, 3, 5]. 

序言的的findall真的是飛馳有用!

相關問題