【问题标题】:Appending element to a list in prolog将元素附加到序言中的列表
【发布时间】:2014-11-24 17:12:27
【问题描述】:

我有一个包含 5 个成员的数据库,其中包含收入属性。我想总结所有成员的收入。 为此,我想创建一个收入列表并添加它们。

为了创建收入列表,我将附加谓词编写为

append(Element, List, OutputList)

这会将元素添加到列表中并在输出列表中返回它。

现在我想把每个成员的收入放到一个列表中,并添加列表的元素。 但我无法将所有元素都放在列表中。你能帮我创建这两个谓词吗? 这是我写的代码。

member(a,2).
member(b,1).
member(c,2).
member(d,3).
member(e,1).

append([],L,L).
append(Elem,L,X):- append([],[Elem|L],X).

% this add predicate is incorrect
add(L,X) :- member(_,Income),append(Income,L,L),X is L.

我想将输出列表生成为 [2,1,2,3,1] 并将它们相加得到 2+1+2+3+1 = 9。

【问题讨论】:

  • 你想让你的add做什么?并注意memberappend 名称。这些可以是内置谓词的名称。

标签: list prolog logic predicate


【解决方案1】:

您需要收集查询member(_, Income) 的所有结果,然后对它们进行汇总。要收集所有匹配结果,您可以使用元谓词 bagofsetoffindall 之一。 您的任务可以通过以下方式完成:

member(a,2).
member(b,1).
member(c,2).
member(d,3).
member(e,1).


sum([], 0).
sum([H|T], S) :-
    sum(T, S1),
    S is S1 + H.

然后是查询:

findall(Income, m(_, Income), Incomes), sum(Incomes, S).

给你:

Incomes = [2, 1, 2, 3, 1],
S = 9

【讨论】:

    猜你喜欢
    • 2017-04-12
    • 2020-09-02
    • 2014-06-10
    • 1970-01-01
    • 2015-02-05
    • 2017-06-23
    • 2017-12-18
    • 2021-10-06
    • 1970-01-01
    相关资源
    最近更新 更多