-1

私はプロローグが初めてで、これを解決しようとしています:

false を返すだけです。

私はプロローグの初心者であり、正確にデバッグする方法がわからない..

livesIn(State):-
member(State,[california,georgia,delaware,iowa,kansas]).

sentGift(Gift):-
member(Gift,[rotisserie,salver,toaster,urn,vase]).

isHusband(Husband):-
member(Husband,[bill,doug,nick,tom,zack]).

solve(Z):-
Z=[[amber,Husband1,State1,Gift1],
   [emily,Husband2,State2,Gift2],
   [janet,Husband3,State3,Gift3],
   [maisie,Husband4,State4,Gift4],
   [patsy,Husband5,State5,Gift5]],

isHusband(Husband1), isHusband(Husband2), isHusband(Husband3), isHusband(Husband4), isHusband(Husband5),
Husband1 \== Husband2, Husband1 \== Husband3, Husband1 \== Husband4, Husband1 \== Husband5,
Husband2 \== Husband1, Husband2 \== Husband3, Husband2 \== Husband4, Husband2 \== Husband5,
Husband3 \== Husband1, Husband3 \== Husband2, Husband3 \== Husband4, Husband3 \== Husband5,
Husband4 \== Husband1, Husband4 \== Husband2, Husband4 \== Husband3, Husband4 \== Husband5,
Husband5 \== Husband1, Husband5 \== Husband2, Husband5 \== Husband3, Husband5 \== Husband4,

livesIn(State1), livesIn(State2), livesIn(State3), livesIn(State4), livesIn(State5),
State1 \== State2, State1 \== State3, State1 \== State4, State1 \== State5,
State2 \== State1, State2 \== State3, State2 \== State4, State2 \== State5,
State3 \== State1, State3 \== State2, State3 \== State4, State3 \== State5,
State4 \== State1, State4 \== State2, State4 \== State3, State4 \== State5,
State5 \== State1, State5 \== State2, State5 \== State3, State5 \== State4,

sentGift(Gift1), livesIn(Gift2), livesIn(Gift3), livesIn(Gift4), livesIn(Gift5),
Gift1 \== Gift2, Gift1 \== Gift3, Gift1 \== Gift4, Gift1 \== Gift5,
Gift2 \== Gift1, Gift2 \== Gift3, Gift2 \== Gift4, Gift2 \== Gift5,
Gift3 \== Gift1, Gift3 \== Gift2, Gift3 \== Gift4, Gift3 \== Gift5,
Gift4 \== Gift1, Gift4 \== Gift2, Gift4 \== Gift3, Gift4 \== Gift5,
Gift5 \== Gift1, Gift5 \== Gift2, Gift5 \== Gift3, Gift5 \== Gift4,

%Aunt Maisie's Husband is Uncle Nick
Husband4 = nick,

%Uncle Bill and Aunt Emily and their respective spouses sent the salver and the urn (in order)
Gift2 = salver,
member([_, bill, _, urn], Z),

%Aunt Amber and Uncle Doug live in Georgia
Husband1 = doug,
State1 = georgia,

%Aunt Patsy and her husband sent a toaster
Gift5 = toaster,

%The rotisserie came from the Delaware relatives
member([_, _, delaware, rotisserie], Z),

%Uncle Zack and his wife(don't live in Kansas) sent neither the salver nor the toaster
\+ member([_, zack, kansas, _], Z),
\+ member([_, zack, _, salver], Z),
\+ member([_, zack, _, toaster], Z),

%Aunt Janet and Uncle Bill live in California
Husband3 = bill,
State3 = california.
4

1 に答える 1

0

機能させる

コードに 2 つのタイプミスがあり、正しい結果が返されません。

最初のタイプミス

ビルおじさんとエミリーおばさん、そしてそれぞれの配偶者は、金属盆と壷を(順番に)送った

したがって、代わりに:

Gift2 = salver,
member([_, bill, _, urn], Z),

そのはず:

Gift2 = urn,                       % Aunt Emily sent the urn
member([_, bill, _, salver], Z),   % Uncle Bill sent the salver

二度目の誤字

どうしたらこのタイプミスができるのかわからない! なんでlivesInプレゼント?

sentGift(Gift1), livesIn(Gift2), livesIn(Gift3), livesIn(Gift4), livesIn(Gift5),
Gift1 \== Gift2, Gift1 \== Gift3, Gift1 \== Gift4, Gift1 \== Gift5,

次のようにする必要があります。

sentGift(Gift1), sentGift(Gift2), sentGift(Gift3), sentGift(Gift4), sentGift(Gift5),
Gift1 \== Gift2, Gift1 \== Gift3, Gift1 \== Gift4, Gift1 \== Gift5,

上記の 2 つのタイプミスを修正した後、コードは正しく動作しますが、解決策に到達するまでに非常に長い時間がかかります。

速くする

  1. ,および述語を介した,および変数のメンバーシップの統一の前に、アトム (たとえばHusband3 = bill, State1 = georgia)による直接の統一を順序付けます。GiftHusbandStatesentGiftisHusbandlivesIn

    実際には、それらを に直接差し込むことができますZ。そして、それらすべての不等式を手動で宣言する代わりに (例: Gift1 \== Gift2, Gift1 \== Gift3, Gift1 \== Gift4, Gift1 \== Gift5)、代わりに述語を記述する方がクリーンです。

  2. メンバーシップの統合 (例: member([_, bill, _, urn], Z)) は、パート 1 の直接統合の後で、変数のメンバーシップ統合の前にGift順序付けHusbandますState

    これには、メンバーシップの統合が成功しないことを主張する が含まれていないことに注意してください。、およびそれらを可能な値の小さなセットに制約する変数のメンバーシップの統合の前に、メンバーシップの統合を満たす統合を見つけることができる可能性があります。これにより、節が発生し、述語全体が失敗します。\+ member([_, zack, _, toaster], Z)GiftHusbandState

上記の 2 つのトリックにより、検索スペースが削減されるため、ソリューションを見つけるのに必要な時間が短縮されます。以下は、上記のテキストを読んだときに記入するサンプル スケルトン コードです。

% Aunt Maisie's Husband is Uncle Nick
Husband4 = nick,

%% TODO: Fill in the rest on your own ...

% Uncle Bill and Aunt Emily and their respective spouses sent the salver and the urn (in order)
Gift2 = urn,




member([_, bill, _, salver], Z),

% The rotisserie came from the Delaware relatives
member([_, _, delaware, rotisserie], Z),




sentGift(Gift1), sentGift(Gift2), sentGift(Gift3), sentGift(Gift4), sentGift(Gift5),
Gift1 \== Gift2, Gift1 \== Gift3, Gift1 \== Gift4, Gift1 \== Gift5,
Gift2 \== Gift1, Gift2 \== Gift3, Gift2 \== Gift4, Gift2 \== Gift5,

%% TODO: Fill in the rest on your own





% Uncle Zack and his wife(don't live in Kansas) sent neither the salver nor the toaster
\+ member([_, zack, kansas, _], Z),
\+ member([_, zack, _, salver], Z),
\+ member([_, zack, _, toaster], Z).
于 2013-04-25T04:59:07.460 に答える