2010-12-06 65 views
4

我想編寫一個函數,通過刪除小於或等於特定數字的所有數字來過濾數字列表。該函數將採用兩個參數:數字列表和要過濾的數字。該函數應返回一個列表,其中所有數字都大於過濾器編號。從序言中的列表中篩選出大量的數字

有時是這樣的:

filter_num_list(L1,N,L2) :- ... 

test_filter_num_list :- filter_num_list([1,2,3,4,5,6,7,8,9],5,[5,6,7,8,9]). 

回答

1

嘗試類似:

filter_num_list([],N,[]) :- true. 
filter_num_list([H|T],N,[H|S]) :- H > N,filter_num_list(T,N,S). 
filter_num_list([H|T],N,S) :- N >= H, filter_num_list(T,N,S). 
5

又見庫謂詞像包括/ 3和排除/ 3:

?- include(=<(5), [1,2,3,4,5,6,7,8,9], Is). 
Is = [5, 6, 7, 8, 9]. 
+1

我不知道`exclude/3`和`include/3`,非常有用,謝謝。 – sharky 2011-08-11 23:17:07

+0

`include/3`和`exclude/3`只是一些** Prolog系統中的庫謂詞。但是這是一個普通的Prolog問題,沒有說明使用的系統。如果你想提供一個只適用於某些系統的答案,至少要列出這些系統。 – 2015-05-06 15:03:50

2

隨着tfilter/3和具體化限制(#<)/3,你可以跟上,快速表達你想要的東西!

:- use_module(library(clpfd)). 

下面是我用37年7月1日SWI-Prolog版本運行的查詢:

?- tfilter(#<(5),[1,2,3,4,5,6,7,8,9],Xs). 
Xs = [6,7,8,9].        % succeeds deterministically 
false. 

由於代碼單調,我們還可以提出更多的一般查詢並得到邏輯聽起來答案。

?- tfilter(#<(7),[A,B,C],Xs). 
Xs = [],  A in inf..7, B in inf..7, C in inf..7 ; 
Xs = [C],  A in inf..7, B in inf..7, C in 8..sup ; 
Xs = [B],  A in inf..7, B in 8..sup, C in inf..7 ; 
Xs = [B,C], A in inf..7, B in 8..sup, C in 8..sup ; 
Xs = [A],  A in 8..sup, B in inf..7, C in inf..7 ; 
Xs = [A,C], A in 8..sup, B in inf..7, C in 8..sup ; 
Xs = [A,B], A in 8..sup, B in 8..sup, C in inf..7 ; 
Xs = [A,B,C], A in 8..sup, B in 8..sup, C in 8..sup ; 
false.