【发布时间】:2018-10-09 21:12:18
【问题描述】:
我在 Prolog 中有这个数据库:
family(person( john, cohen, date(17,may,1990), unemployed), person( lily, cohen, date(9,may,1990), unemployed),[ ] ).
family(person( john, armstrong, date(7,may,1988), unemployed), person( lily, armstrong, date(29,may,1961), unemployed), [ ] ).
family(person( eric, baily, date(7,may,1963), works( bbc, 2200)), person( grace, baily, date(9,may,1965), works( ntu, 1000)), [person( louie, baily, date(25,may,1983), unemployed) ] ).
family(person( eric, baily, date(7,may,1963), works( acc, 21200)), person( grace, baily, date(9,may,1965), works( ntnu, 12000)), [person( louie, baily, date(25,may,1983), unemployed) ] ).
family(person( eric, fox, date(27,may,1970), works( bbc, 25200)), person( grace, fox, date(9,may,1971), works( ntbu, 13000)), [person( louie, fox, date(5,may,1993), unemployed) ] ).
husband(X) :- family(X, _, _).
wife(X) :- family(_, X, _).
child(X) :- family(_, _, Children), member(X, Children).
salary(person(_, _, _, works(_, S)), S).
salary(person(_, _, _, unemployed), 0).
格式为: 家庭(丈夫,妻子,[孩子])。 家庭中的每个人都有姓名、姓氏、出生日期、工作和薪水。
我有一个作业要求我编写以下规则:
1) 编写一个 prolog 规则“totalIncome/2”来计算一个家庭的总收入。
2) 编写一个 prolog 查询来打印每个家庭的总收入。
我能够在一个列表中获得丈夫的薪水,在另一个列表中获得妻子的薪水。
salaries(L) :- findall(X,family(person(_,_,_,works(_,X)),_,_),L).
salaries(L2) :- findall(X,family(_,person(_,_,_,works(_,X)),_),L2).
我似乎无法理解它,因此感谢您提供任何帮助。谢谢
【问题讨论】:
-
您可以使用
aggregate库。 -
但也许首先计算值列表的总和更有意义,您将如何实现
sum/2谓词使得sum([1,4,2,5], 12).? -
@MichaelRahmeh:你还需要一个基本案例
sum([], 0)。但确实,递归部分是正确的。 -
现在有了
findall/3,您可以获得所有收入:swi-prolog.org/pldoc/doc_for?object=findall/3 -
@MichaelRahmeh:
findall/3也有,你可以先统一到一个特定的家庭,然后找到这些人的工资,然后用sum把这些加起来.
标签: prolog