Почему я не могу получить ответ на загадку зебры в прологе?
Это мой код в настоящее время, я пытаюсь решить загадку зебры.
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-пролог, он возвращает предупреждающее сообщение о единственном использовании N1,P1,C1 и т. Д. И возвращает true, затем я прошу его напечатать питьевой воды, используя print(WaterDrinker), и он возвращает _G317 и true,
почему он делает это и не возвращает ответ, который может быть норвежским, он делает то же самое, если я прошу его вернуть любую переменную, например C3 или ZebraOwner
1 ответ
Основная проблема в том, что вы не можете написать цель, как :- Houses = ...
в середине вашей программы. Скорее, вы должны написать что-то вроде
solution(WaterDrinker, ZebraOwner) :-
Houses = ...
а затем после загрузки программы введите
solution(W, Z).
на -?
подскажите решение.
Вы также не указываете, что все значения должны быть разными. Если вы сделаете это, вы будете использовать переменные во второй раз, и предупреждение исчезнет.
Если вам действительно нужна переменная только один раз, вы можете добавить к ней подчеркивание, чтобы предупреждение исчезло. Или вы можете просто использовать подчеркивание, как вы уже делали много раз.