我需要编写一条规则,只能找到列表M中的数字,只输出列表O中的数字。
查询类似于:find(M, O)
我无法自己解决这个问题,希望有人可以帮助我。
答案 0 :(得分:3)
这是另一种使用findall/3
的方法,它在大多数Prolog实现中都可用。但对于初学者来说,谢尔盖的回答可以说是初学者学习基本递归列表处理的最佳方法。
find(M, O) :-
findall(X, (member(X, M), number(X)), O).
答案 1 :(得分: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
)。
第三个条款在结构上与第二个条款相似,但如果它不是一个数字,则表示不要保持头脑。
答案 2 :(得分:2)
如果您正在使用swi-prolog,那么您很乐意使用include/3
谓词:
find_numbers(M,O) :-
include(number,M,O).