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 シェルでクエリを実行する) ユーザーは X が夫の名前を表し、Y が妻の名前を表すことを知っている必要があるため、それがクリーンなソリューションであるかどうかはわかりません。

より良い解決策はありますか?

4

2 に答える 2