2016-04-16 18 views
1

私はPrologを初めて利用しています。私はパラダイムプログラミングの主題を取っているので、私は数週間ごとに異なるプログラミングを学ぶ必要があります。Prologリストで家族最長と最年少の子供を見つけよう

私は、家族の中で最も長男と最年少の子供を見つけて練習をしました。私の知識データベースは以下のとおりです。

family(person(alex, fox, date(26, oct, 1970), work(ucl, wc1e)), 
     person(lan, fox, date(6, dec, 1971), unemployed), 
     [ person(adrian, fox, date(17, nov, 1996), unemployed), 
     person(lisa, fox, date(7, june, 2002), unemployed) 
     ]). 
family(person(james, bond, date(29, feb, 1950), work(mi6, secretLocation)), 
     person(girl, bond, date(01, dec, 2004), unemployed), 
     []). 
family(person(superman, hero, date(29, feb, 1979), unemployed), 
     person(superwoman, hero, date(29, feb, 1979), work(crisisSpot, anywhere)), 
     [ person(superbaby, hero, date(7, june, 2002), unemployed) ]). 
family(person(picard, captain, date(29, feb, 2400), unemployed), 
     person(kirk, captain, date(29, feb, 2300), unemployed), 
     [ person(janeway, captain, date(29, feb, 2450), unemployed), 
     person(cisco, captain, date(29, feb, 2450), unemployed) 
     ]). 

私はすでに私は数回はまだアイデアを得ていないしようとしただけでこれだけ質問残り疑問を解決し、私はトラブルの理解がリストの仕事にどのように子供であることです。どんな助けもありがとう。

% Find eldest children in family 
dateofbirth(person(_,_,Date,_), Date). 
eldest(X,Y) :- 
    family(_,_,Kids), 
    member(X,Kids), 
    dateofbirth(X, date(_,_,Y)), 
    (dateofbirth(X, date(_,_,Y)). 

上記は私の答えですが、まだ動作しません。

+0

eldestはどういう意味ですか?これはちょうど1年か1月か1月かによるのでしょうか? – false

+0

子供の年。返信してくれてありがとう。家族の中で一番年長の子供や幼い子供を見つける年。 – noleavename

答えて

2

長年の子供を表すものとして、1つの場所の述語が必要と考えられます。 eldestkid/1。それから、すべての子供をリストに入れておくと便利です。あなたの述語長男/ 2の最初の2つのゴール...

?- family(_,_,Kids),member(X,Kids). 
Kids = [person(adrian,fox,date(17,nov,1996),unemployed),person(lisa,fox,date(7,june,2002),unemployed)], 
X = person(adrian,fox,date(17,nov,1996),unemployed) ? ; 
... 

で調べると...彼らはあなたに、変数X 1対1にバインドされたすべての子供たちを与えます。

?- setof(X,A^B^Kids^(family(A,B,Kids),member(X,Kids)),L). 
L = [person(adrian,fox,date(17,nov,1996),unemployed),person(cisco,captain,date(29,feb,2450),unemployed),person(janeway,captain,date(29,feb,2450),unemployed),person(lisa,fox,date(7,june,2002),unemployed),person(superbaby,hero,date(7,june,2002),unemployed)] 

残りの部分はかなり単純です:

:- use_module(library(lists)). 

eldestkid(K) :- 
    setof(X,A^B^Kids^(family(A,B,Kids),member(X,Kids)),L), 
    eldest_in(K,L).      % K is the eldest kid in L 

eldest_in(EK,[K|Ks]) :-    % the first kid in the list 
    eldest_in_(EK,Ks,K).    % is the eldest so far 

eldest_in_(EK,[],EK).     % empty list: ESF is eldest 
eldest_in_(EK,[K|Ks],ESF) :-   % case 1: the Eldest So Far 
    dateofbirth(K, date(_,_,KY)), 
    dateofbirth(ESF, date(_,_,ESFY)), 
    ESFY =< KY,       % is elder that K ... 
    eldest_in_(EK,Ks,ESF).    % hence still the ESF 
eldest_in_(EK,[K|Ks],ESF) :-   % case 2: the ESF 
    dateofbirth(K, date(_,_,KY)), 
    dateofbirth(ESF, date(_,_,ESFY)), 
    ESFY > KY,       % is younger than K 
    eldest_in_(EK,Ks,K).    % hence K is now the eldest 

dateofbirth(person(_,_,Date,_), Date). 

例クエリ:eldest_in_

​​

注意/それでは、リスト内のすべてのこれらの子供たちを取得するために/ 3 SETOF使用してみましょうあなたのコメントに示唆されているように、3年だけ比較しています。月と日も考慮したい場合は、その述語を記述し、それに応じてeldest_in_/3の比較目標を置き換える必要があります。

+0

あなたの役に立つ説明と返信ありがとう!あなたのコードは動作しますが、私はあなたのコードを理解するのに時間が必要です。ご協力いただきありがとうございます。 – noleavename

関連する問題