2014-10-28 43 views
2

我需要寫一個規則的數字,有什麼發現只有在列舉M數字輸出只有在列表中的號碼O.僅查找列表

查詢看起來像:find(M, O)

我想不出它並且希望有人能幫助我。

+1

到目前爲止您嘗試過什麼?我們喜歡幫助首先幫助自己的人:) – 2014-10-28 21:15:35

回答

2

這裏是一個 「經典的Prolog」 的方式做到這一點:

find([], []). 
find([H|T], [H|NewT]) :- 
    number(H), 
    find(T, NewT). 
find([H|T], NewT) :- 
    \+ number(H), 
    find(T, NewT). 

有3項條款。

1st表示對於一個空列表結果是一個空列表。

第二說:如果輸入列表的第一個元素(頭,H)是一個數字,保持它在輸出中,和輸出的剩餘部分(新尾,NewT)是find施加到的其餘部分輸入列表(尾部,T)。

第3個子句與第2個子句在結構上相似,但是如果它不是數字,則表示不保持頭部。

2

如果您正在使用SWI-Prolog的,你會很高興使用include/3謂詞像這樣:

find_numbers(M,O) :- 
    include(number,M,O). 
3

這裏的另一種方法,使用findall/3這是大多數的Prolog實現可用。但對於初學者來說,謝爾蓋的答案對於初學者來說可以說是最適合學習基本遞歸列表處理是如何工作的。

find(M, O) :- 
    findall(X, (member(X, M), number(X)), O).