PROLOG根据事实创建的列表的总和

时间:2012-05-15 03:07:30

标签: list prolog

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

例如:

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

但是如果要总结现有列表,如何定义谓词?

3 个答案:

答案 0 :(得分:0)

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

?- sum_list([1,2,3],Sum).
Sum = 6.

答案 1 :(得分: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的第一个arg一起使用,这个版本就足够了:

sum_facts(Template, Arg, Sum) :-
   aggregate_all(sum(X), abc(X, _, _), Sum).

答案 2 :(得分:0)

根据Vaughn Cato的建议,通过使用findall(X,abc(X, _ , _ ),A).创建我想要的列表,它帮助了我很多。