我是Prolog的新手,我试图了解列表的概念。我正在尝试的一个例子是:
value(a, 1).
value(b, 2).
value(a, 3).
value(a, 4).
value(c, 3).
我正在尝试创建一个谓词,当查询find(a, List)
时会导致:List = [1, 3, 4].
它简单地覆盖了所有事实,并将匹配的事实添加到列表中。
我尝试过这样的事情。但它看起来并不正确:
find(X, List):-
value(X, D), append([D], [], [List|Rest]), find(X, [Head|List]).
对这样一个基本问题感到抱歉。任何指导都表示赞赏。
注意:我打算通过添加列表中的所有值来扩展程序。
答案 0 :(得分:3)
看看这里:http://www.swi-prolog.org/pldoc/doc_for?object=findall/3
我相信你尝试做的事情已经存在,试试这个:
?- findall(X,value(a,X),List).
我没有在这台机器上安装prolog,所以我无法完美地测试它,但这应该可以让你找到你想要的东西。
编辑:抱歉设法进入swi并意识到我有2个参数被反转,现在看到更新的代码。还测试了它,它的工作原理: - )
编辑2:根据上面的评论,您可以收集与“a”匹配的值,并获得可以合并到此的总和:
?- findall(X, value(a,X), List), sumlist(List, Sum).
-Ken