简单的数据结构

时间:2013-04-02 19:11:49

标签: prolog

以下简单的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>

有更好的解决方案吗?

2 个答案:

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

是对的。即我们可以将谓词,它们的参数的提示名称用作自我记录功能。评论也很好。