我有以下简单的Prolog程序,通过使用数据结构,代表一个由丈夫、妻子和孩子组成的家庭列表:
family(
person(bob, smith, date(7,may,1968), 30000),
person(ann, smith, date(18,july,1970), 32000),
[person(dave, smith, date(1,june,1984), 0),
person(edna, smith, date(25,may,1990), 0)]
).
family(
person(mario, rossi, date(7,may,1968), 30000),
person(lucia, verdi, date(18,july,1970), 32000),
[person(luca, rossi, date(1,june,1984), 5000),
person(maria, rossi, date(25,may,1990), 0),
person(paolo, rossi, data(16, april, 1980), 10000)]
).
family(
person(carlo, bianchi, date(7,may,1968), 30000),
person(flavia, blabla, date(18,july,1970), 32000),
[person(figlio1, bianchi, date(1,june,1984), 0),
person(figlio2, bianchi, date(25,may,2001), 0),
person(figlio3, bianchi, data(16, april, 1980), 10000),
person(figlio4, bianchi, data(10, april, 1978), 20000)]
).
family(
person(no, no, date(7,may,1968), 30000),
person(no, no, date(18,july,1970), 32000),
[]
).
/* Regola che mostra i mariti: */
husband(X) :- family(X,_,_).
/* Regola che mostra l mogli: */
wife(X) :- family(_,X,_).
/* Regola che mostra i figli:
X è figlio se in una famiglia c'è una lista di figli e se X appartiene
alla lista dei figli: */
child(X) :- family(_,_,Children),
member(X,Children).
这很简单。根据一些事实,我代表某个家庭,并且我有一些规则来执行一些查询(获取丈夫、妻子、如果 X 是家庭中的孩子、如果家庭中存在一个人、一个人的薪水和日期一个人的出生)
好的,直到现在我都没有问题。
然后我有以下与上一个程序相关的练习:写一个规则,计算每个家庭所有孩子的总工资
所以我必须计算一个我称之为 ChildrenIncoming 的值,它表示属于特定家庭的所有孩子的薪水总和(代表家庭数据结构中孩子的个人数据结构中的最后一个值)
我发现实现这个功能有很多问题。
我从更简单的任务(例如检索丈夫的薪水)开始,如下所示:
husbandIncoming(HSurname, HIncoming) :- husband(HSurname), % Seleziona un cognome
salary(HSurname, HIncoming).
我试图计算 ChildrenIncoming 值试图做类似的事情(它不完整并且不起作用):
childrenList(Husband,ChildrenList) :- family(Husband,_,ChildrenList).
/* If ChildrenList is empty: ChildrenIncomung value 0 */
childrenIncoming(Husband,[],0).
childrenIncoming(Husband,ChildrenList,ChildrenIncoming) :-
childrenList(Husband,ChildrenList),
ChildrenList = [Head|Tail],
childrenIncoming(Husband,Tail,TailIncoming),
salary(Head, ChildrenIncoming).
第一件事是我通过丈夫识别了一个家庭,这样我就可以使用childrenList规则检索ChildrenList(这个规则很好用)。
然后我会计算这个 ChildreList 中所有人的所有工资的总和,为此我引入了必须计算它的关系childrenIncoming 。
这种关系始于简单地说:
childrenIncoming(Husband,[],0).
如果一个家庭(有丈夫作为家长)有空的孩子列表,那么孩子的总传入是 0。
然后我介绍了一个规则(错误),它应该在非空子列表的情况下计算这个值。
这条规则背后的原因是:
1) 非空子列表包含人员。
2)一个非空列表可以分为一个Head of the list(即一个人)和一个Tail sublist(一个人的列表)
3) 头是人,有薪水
4)尾部包含人,每个人都有薪水
但是我不知道如何以正确的方式混合这些想法以获得所需的结果(孩子列表中所有人的总传入值)
我不知道这种或推理是好的还是我从一开始就错了。