Lambda 根据另一个列表的给定元素创建元组列表

Lambda 根据另一个列表的给定元素创建元组列表,lambda,prolog,tuples,primes,nested-lists,Lambda,Prolog,Tuples,Primes,Nested Lists,基本上,我所做的就是创建一个元组列表,格式为a=[[1,2,3],[1,2,12],[1,2,5]使用事实makelist(a) 我现在要做的是使用它创建另一个列表,其中只包含对给定事实为真的元组 例如,我有一个测试,如果一个数字是primeprime(N)(它接受一个数字,如果它是prime则返回true),我想用它来只保留a中的第三个元素是prime。所以A=[[1,2,3],[1,2,5]] 我曾尝试使用predsort,但似乎仅在一个元素上不起作用。我认为可以使用排除来完成,但我似乎无法

基本上,我所做的就是创建一个元组列表,格式为
a=[[1,2,3],[1,2,12],[1,2,5]
使用事实
makelist(a)

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

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

我曾尝试使用
predsort
,但似乎仅在一个元素上不起作用。我认为可以使用
排除
来完成,但我似乎无法让它工作

谢谢你能给我的任何帮助。

有了,你可以写:

% 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).
:- [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).
没有它,你可以写:

:- [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).
顺便说一句,您提到了使用
exclude/3
:这些解决方案与使用它的解决方案完全相同,只是它们使用了它的对偶谓词,
include/3
,,您可以这样写:

:- [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).
没有它,你可以写:

:- [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).

顺便说一句,您提到了使用
exclude/3
:这些解决方案与使用它的解决方案完全相同,只是它们使用了它的双谓词,
include/3

@user1310221:不客气。顺便说一句,如果你已经习惯了函数式编程习惯,比如过滤器和映射,我真的建议你看看我链接的
lambda
库,它会让你的生活变得更加简单,值得学习。@user1310221:不客气。顺便说一句,如果你已经习惯了函数式编程习惯,比如filter和map,我真的建议你看看我链接的
lambda
库,它会让你的生活变得更加简单,值得学习。