仅查找列表中的数字

时间:2014-10-28 21:13:08

标签: prolog

我需要编写一条规则,只能找到列表M中的数字,只输出列表O中的数字。

查询类似于:find(M, O)

我无法自己解决这个问题,希望有人可以帮助我。

3 个答案:

答案 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).