3

これは現在私のコードです、私はゼブラパズルを解こうとしています。

exists(A,(A,_,_,_,_)).
exists(A,(_,A,_,_,_)).
exists(A,(_,_,A,_,_)).
exists(A,(_,_,_,A,_)).
exists(A,(_,_,_,_,A)).

rightOf(A,B,(B,A,_,_,_)).
rightOf(A,B,(_,B,A,_,_)).
rightOf(A,B,(_,_,B,A,_)).
rightOf(A,B,(_,_,_,B,A)).

middleHouse(A,(_,_,A,_,_)).

firstHouse(A,(A,_,_,_,_)).

nextTo(A,B,(B,A,_,_,_)).
nextTo(A,B,(_,B,A,_,_)).
nextTo(A,B,(_,_,B,A,_)).
nextTo(A,B,(_,_,_,B,A)).
nextTo(A,B,(A,B,_,_,_)).
nextTo(A,B,(_,A,B,_,_)).
nextTo(A,B,(_,_,A,B,_)).
nextTo(A,B,(_,_,_,A,B)).

:- Houses = (house(N1,P1,S1,D1,C1),house(N2,P2,S2,D2,C2),house(N3,P3,S3,D3,C3),house(N4,P4,S4,D4,C4),house(N5,P5,S5,D5,C5)),
exists(house(english,_,_,_,red),Houses),
exists(house(spainish,dog,_,_,_),Houses),
exists(house(_,_,_,coffee,green),Houses),
exists(house(ukrainian,_,_,tea,_),Houses),
rightOf(house(_,_,_,_,green),house(_,_,_,_,ivory),Houses),
exists(house(_,dog,oldgold,_,_),Houses),
exists(house(_,_,kools,_,yellow),Houses),
middleHouse(house(_,_,_,milk,_),Houses),
firstHouse(house(norwegian,_,_,_,_),Houses),
nextTo(house(_,_,chesterfields,_,_),house(_,fox,_,_,_),Houses),
nextTo(house(_,_,kools,_,_),house(_,horse,_,_,_),Houses),
exists(house(_,_,luckystike,orangejuice,_),Houses),
exists(house(japanise,_,parliments,_,_),Houses),
nextTo(house(norwegian,_,_,_,_),house(_,_,_,_,blue),Houses),
exists(house(WaterDrinker,_,_,water,_),Houses),
exists(house(ZebraOwner,zebra,_,_,_),Houses).

これを入力してzebra.plとして保存しました。これを開いて、[zebra]をSWI-prologに入力すると、N1、P1、C1などのシングルトン使用に関する警告メッセージが返され、trueが返されます。 print(WaterDrinker)を使用して水を飲む人を印刷するように依頼すると、_G317とtrueが返されます。

なぜそれがこれを行い、ノルウェー語である可能性のある答えを返さないのですか?C3やZebraOwnerのような変数を返すように頼んだ場合も同じです

4

1 に答える 1

5

:- Houses = ...主な問題は、プログラムの途中のように目標を書くことができないことです。むしろ、あなたは次のようなものを書くべきです

solution(WaterDrinker, ZebraOwner) :-
    Houses = ...

プログラムがロードされた後、

 solution(W, Z).

-?解を計算するためのプロンプトで。

また、すべての値を区別する必要があることを指定する必要はありません。これを行うと、変数を2回使用し、警告が消えます。

変数が本当に必要なのは一度だけの場合は、警告を消すためにアンダースコアを前に付けることができます。または、すでに何度も行ったように、アンダースコアを使用することもできます。

于 2011-09-07T18:43:32.233 に答える