2014-10-28 42 views
2

我需要写一个规则的数字,有什么发现只有在列举M数字输出只有在列表中的号码O.仅查找列表

查询看起来像:find(M, O)

我想不出它并且希望有人能帮助我。

+1

到目前为止您尝试过什么?我们喜欢帮助首先帮助自己的人:) – 2014-10-28 21:15:35

回答

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)。

第3个子句与第2个子句在结构上相似,但是如果它不是数字,则表示不保持头部。

2

如果您正在使用SWI-Prolog的,你会很高兴使用include/3谓词像这样:

find_numbers(M,O) :- 
    include(number,M,O). 
3

这里的另一种方法,使用findall/3这是大多数的Prolog实现可用。但对于初学者来说,谢尔盖的答案对于初学者来说可以说是最适合学习基本递归列表处理是如何工作的。

find(M, O) :- 
    findall(X, (member(X, M), number(X)), O).