2012-04-03 168 views
1

基本上,我设法使用事实makelist(A)创建A = [[1,2,3],[1,2,12],[1,2,5]]形式的元组列表。根据另一个列表的给定元素创建一个元组列表

我现在想要做的是使用它创建另一个列表,其中只包含对于给定事实而言为真的元组。

例如,我有一个测试,如果一个数字是素数prime(N)(它需要一个数字并返回true,如果它是素数),则返回true我想使用它只保留A中素数的第三个元素。所以A = [[1,2,3],[1,2,5]]

我试过使用predsort,但似乎不适用于只有一个元素。我认为这可以使用exclude完成,但我似乎无法使其工作。

感谢您给我的任何帮助。

回答

1

随着lambda.pl,你可以写:

:- [lambda]. 
filter_third_prime(Lists, Result) :- 
    include(\[_, _, X|_]^prime(X), Lists, Result). 

没有它,你可以写:

filter_third_prime2(Lists, Result) :- 
    include(third_is_prime, Lists, Result). 
third_is_prime([_, _, X|_]) :- 
    prime(X). 

顺便说一句,你mentionned使用exclude/3:这些解决方案是使用它完全一样的,只有他们使用它的双谓词include/3

+0

感谢第二个真正帮助! – user1310221 2012-04-03 11:36:15

+0

@ user1310221:不客气。顺便说一句,如果你习惯了过滤器和地图等功能性编程习惯用法,我真的建议你看看我链接的'lambda'库,它会让你的生活变得更容易,值得它学习。 – m09 2012-04-03 11:40:47

0
% Assumes notPrime(N) is true iff N isn't prime 
thirdPrimes([],[]). 
thirdPrimes([A|B],[A|BP]) :- A=[_,_,N|_],prime(N),thirdPrimes(B,BP). 
thirdPrimes([[_,_,N|_]|B],BP) :- notPrime(N),thirdPrimes(B,BP). 
相关问题