将原子添加到列表序言中

时间:2013-06-20 17:15:10

标签: prolog

我是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]).

对这样一个基本问题感到抱歉。任何指导都表示赞赏。

注意:我打算通过添加列表中的所有值来扩展程序。

1 个答案:

答案 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