以下简单的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代表妻子的名字。< / p>
有更好的解决方案吗?
答案 0 :(得分:2)
您提出了一个关于Prolog谓词的命名约定的一般性问题。一个好的经验法则是使用一个明确 参数的名称。例如,如果第一个参数是丈夫而第二个参数是他的妻子,则谓词名称的起点可以是:
husband_wife(X, Y) :- ...
但是,在您的情况下,该名称还应明确指出特定属性另外存在,即该夫妻没有子女。怎么样:
childless_husband_wife(X, Y) :- ...
对我来说似乎很清楚。
您可以提出有关family/3
的相同问题。在我看来,一个更好的名字是husband_wife_children/3
,因为它清楚地说明了它的论点。我们最终得到:
childless_husband_wife(H, W) :- husband_wife_children(H, W, []).
答案 1 :(得分:1)
您必须在very_long_predicate_names
的自我记录和笨拙之间找到平衡点。恕我直言
childless(Husb,Wife):- % a childless family
family(Husb,Wife,[]).
是对的。即我们可以将谓词,和它们的参数的提示名称用作自我记录功能。评论也很好。