首页 文章

查询prolog关于事实和列表

提问于
浏览
0

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

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

我的查询将是:

counts(a,Var).

哪里 Var = [apple,banana,orange] . 我不希望以这种方式

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

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

2 回答

  • 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]
    
  • 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, !.
    

相关问题