从列表中查询事实

时间:2011-02-21 22:03:51

标签: prolog

我是prolog的新手,我想解决这个问题。假设我有一个清单说
List[a,b,c] 现在我有一些事实说 likes(a,banana).
likes(b,orange).
likes(c,apple).
likes(d,grapes).


所以,如果我进行查询

?- my_functor(List,X).
X=[banana,orange,apple].


谢谢你。

1 个答案:

答案 0 :(得分:3)

考虑:

?- List=[a,b,c], findall(X, (member(Y, List), likes(Y, X)), Xs).
List = [a, b, c],
Xs = [banana, orange, apple].

说明:

findall/3被称为'all-solutions'谓词,它试图找到第一个参数(这里,这是变量X)的所有可能值到秒参数的解决方案(这里,这是联接(member(Y, List), likes(Y, X))),并将X的所有值放入一个列表中,绑定到第三个参数(此处为Xs)。

请注意,为X生成值的内部表达式是回溯的语句,以便为X提供不同的分配:

?- member(Y, [a,b,c]), likes(Y, X).
Y = a,
X = banana ;
Y = b,
X = orange ;
Y = c,
X = apple ;
false.

使用SWI-Prolog测试。

请注意findall/3 also appears in GNU Prolog在大多数其他实施中。