查询prolog关于事实和列表

时间:2011-02-12 06:41:42

标签: prolog

我是Prolog的新手,我遇到了问题。我有以下事实:

_________________
likes(a,apple).
likes(a,banana).
likes(a,orange).
_________________

我的查询将是:

counts(a,Var).

其中Var = [apple,banana,orange]。我不希望以这种方式

Var=apple ;
Var=banana;
Var=orange;

任何建议或帮助将不胜感激。提前致谢。

2 个答案:

答案 0 :(得分:1)

我会求助于全能的findall/3来解决你的问题。

?- findall(Fruit, likes(a, Fruit), Fruits), length(Fruits, N).

Fruits = [apple,banana,orange]
N = 3

因此,您的counts(a, Var)只是一个findall/3电话(即使它确实收集而非计数):

counts(Person, Fruits) :- findall(Fruit, likes(Person, Fruit), Fruits).

结果你得到以下结果:

?- counts(a, Var).

Var = [apple,banana,orange]

答案 1 :(得分:0)

如果我理解正确的话,你想要计算一些像水果一样的实体数量。那么,代码将是这样的:

likes(a,apple).
likes(a,banana).
likes(a,orange).

counts(a, [_], 1).
counts(a, [H|T], Count) :- likes(a, H), counts(a, T, Count1), Count is 1 + Count1, !.