2010-12-06 62 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.