1

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

抱歉这么基本的问题。任何指导表示赞赏。

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

4

1 回答 1

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).

-肯

于 2013-06-20T17:23:33.467 回答