我是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].
谢谢你。
答案 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在大多数其他实施中。