下面这个简单的 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), 0),
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 是家庭中的孩子、如果家庭中存在一个人、一个人的薪水和日期一个人的出生)
好的,直到现在我都没有问题。
然后我有以下与上一个程序相关的练习:编写规则以获取所有没有孩子的家庭
我的想法是,如果孩子列表是空列表,则家庭没有孩子。获得一个没有孩子的家庭意味着显示这些家庭的夫妻姓名,我在之前的程序中添加这条规则来解决它:
nochildren(X,Y) :- family(X,Y,[]).
它可以工作,但我不知道它是否是一个干净的解决方案,因为用户(在 Prolog shell 中执行查询)必须知道 X 代表丈夫姓名,而 Y 代表妻子姓名。
有更好的解决方案吗?