簡體   English   中英

如何編寫計算平均工資的序言規則?

[英]How to write a prolog rule that calculates the average salary?

我在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)編寫一個序言規則“ totalIncome / 2”來計算一個家庭的總收入。

2)編寫序言查詢以打印每個家庭的總收入。

我能夠從清單中獲得丈夫的薪水,並從另一個清單中獲得妻子的薪水。

salaries(L) :- findall(X,family(person(_,_,_,works(_,X)),_,_),L).
salaries(L2) :- findall(X,family(_,person(_,_,_,works(_,X)),_),L2).

我似乎無法解決這個問題,因此感謝您的幫助。 謝謝

我認為您正在尋找一個艱難的方向...您不應該計算不同家庭的薪水,例如妻子的薪水,但是一個家庭的薪水,這是我的實現:

add(X,Y,Sum):- Sum is X+Y.
sum(Xs,Sum):- foldl(add,Xs,0,Sum).

totalIncome(family(X,Y,T), Income):- 
         family(X,Y,T),maplist(getSalary,[X,Y|T], L), sum(L,Income).

getSalary(person(_,_,_,works(_,X)), X).
getSalary(person(_,_,_,unemployed), 0).

例:

?- totalIncome(X,P).
X = family(person(john, cohen, date(17, may, 1990), unemployed), person(lily, cohen, date(9, may, 1990), unemployed), []),
P = 0 ;
X = family(person(john, armstrong, date(7, may, 1988), unemployed), person(lily, armstrong, date(29, may, 1961), unemployed), []),
P = 0 ;
X = 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)]),
P = 3200 ;
X = 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)]),
P = 33200 ;
X = 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)]),
P = 38200 ;
false.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM