2011-09-07 18 views
3

這是我目前的代碼,我正在努力解決the zebra puzzle爲什麼不能在prolog中得到斑馬謎題的答案?

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,這個我打開它,然後輸入[斑馬]進入SWI-Prolog的,它返回有關單使用N1,P1,C1等的警告消息..並返回true,然後我要求它使用print(WaterDrinker)打印飲水機並返回_G317併爲true,

爲什麼它這樣做而不返回可能是挪威語的答案,它也會如此我要求它返回任何變量像C3或ZebraOwner

+0

閱讀維基文章讓我的大腦受到傷害。 –

回答

5

主要問題是,你不能在你的程序中間寫一個像:- Houses = ...這樣的目標。相反,你應該寫類似

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

再經過該計劃已在-?提示計算解決方案被加載類型

solution(W, Z). 

您也沒有指定所有的值應該是不同的。如果你這樣做,你會再次使用這些變量,並且警告將消失。

如果您確實只需要一個變量,您可以用下劃線加上一個下劃線來使警告消失。或者你可以使用下劃線,就像你已經做了很多次一樣。

+0

是的,謝謝,完美的工作 – Heidi

相關問題