1

下面这个简单的 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 代表妻子姓名。

有更好的解决方案吗?

4

2 回答 2

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, []).

于 2013-04-02T19:28:44.070 回答
1

您必须在自我记录和very_long_predicate_names. 恕我直言

childless(Husb,Wife):-    % a childless family
  family(Husb,Wife,[]).

差不多吧。即,我们可以为谓词及其参数使用暗示性名称作为自记录功能。评论也不错。

于 2013-04-02T20:11:05.577 回答