0

我想根据事实创建一个列表。并且该列表应仅包含事实中的一项。

例如 :

%facts
abc(a, b, c).
abc(d, e, f).
abc(g, h, i).

样本 :

?-lists(A).
  A = [a, d, g];
  No.

编辑 :

使用Vaughn Cato评论中的建议,代码变为:

%facts
abc(a, b, c).
abc(d, e, f).
abc(g, h, i).

lists(A) :-
    findall(findall(X, abc(X, _, _), A).

列表已创建,但如何总结列表A

如果查询输入的列表总和,

sumlist([], 0).
sumlist([X|Y], Sum) :-
    sumlist(Y, Sum1),
    Sum is X + Sum1.

但是如果要对现有列表求和,如何定义谓词?

4

3 回答 3

0

正如 Vaughn Cato 所建议的,使用它findall(X,abc(X, _ , _ ),A).来创建我想要的列表对我有很大帮助。

于 2012-06-06T10:13:41.300 回答
0

总结一个数字列表,例如由您的定义产生的数字列表lists/1,大多数 Prolog 系统(例如,GNUSWI)实现sum_list/2将数字列表作为第一个参数并在第二个参数中绑定它们的总和:

?- sum_list([1,2,3],Sum).
Sum = 6.
于 2012-05-15T04:10:47.383 回答
0

您也可以使用 aggregate_all/3 解决它。如果您只需要一个总和,它就不需要在内存中构建列表。

sum_facts(Template, Arg, Sum) :-
   aggregate_all(sum(X), (call(Template), arg(Arg, Template, X)), Sum).

在此示例中,我使用定义模板的通用调用:

sum_facts(abc(_, _, _), 1, Sum).

如果你总是将它与 abc/3 的第一个参数一起使用,这个版本就足够了:

sum_facts(Template, Arg, Sum) :-
   aggregate_all(sum(X), abc(X, _, _), Sum).
于 2012-05-15T09:58:57.773 回答