2011-09-07 2 views
3

이것은 현재 내 코드입니다. the zebra puzzle을 해결하려고합니다.프롤로그에서 얼룩말 퍼즐에 대한 답변을 얻을 수없는 이유는 무엇입니까?

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 - 프롤로그에 [얼룩말]를 입력이, 그것은 N1, P1, C1 등의 단독 사용에 대한 경고 메시지를 반환 .. 그리고 진실한 것을 돌려 보낸다, 나는 인쇄 (WaterDrinker)를 사용하여 물 술꾼을 인쇄하기 위하여 그것을 요구하고 _G317와 진실한,

를 돌려 보낸다

왜 이것을하고 있고 노르웨이 인 일 수 있던 응답을 돌려 보내지 않는 경우에, C3 또는 ZebraOwner와 같은 변수를 반환하도록 요청하십시오.

+0

wiki 기사를 읽으면 내 두뇌가 상했다. –

답변

5

주요 문제는 프로그램 중간에 :- Houses = ...과 같은 목표를 쓸 수 없다는 것입니다. 오히려, 당신이

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

과 같이 작성해야 다음 프로그램이 솔루션을 계산할 프롬프트 -?에서 형에게

solution(W, Z). 

을로드 된 후.

또한 모든 값을 구별해야한다고 지정하지 마십시오. 그렇게하면 두 번째 변수를 사용하게되고 경고가 사라집니다.

변수를 한 번만 필요로하는 경우 경고 앞에 밑줄을 붙이면 경고가 사라집니다. 또는 이미 여러 번했듯이 밑줄을 사용할 수도 있습니다.

+0

예, 완벽하게 작동했습니다. – Heidi

관련 문제