Решение загадок Пролог
Заявление:
Всего четыре пары
Посетил костюмированный бал.
2
Леди, одетая как кошка
Прибыл с мужем Мэттом.
3
Две пары уже были там,
Один мужчина одет как медведь.
4
Первым прибыл не Винс,
Но он добрался до князя.
5
Ведьма (не Сью) замужем за Чаком,
Кто был одет как Дональд Дак.
6
Мэри пришла за Лу,
Оба были там до Сью.
7
Цыганка прибыла до Энн,
Никто не женат на Бэтмене.
8
Если Белоснежка прибыл после Тесс,
Тогда как каждая пара была одета?
Мой код здесь, но он возвращает false:
sol(S):-
S=[[1,L1,M1,LD1,MD1],
[2,L2,M2,LD2,MD2],
[3,L3,M3,LD3,MD3],
[4,L4,M4,LD4,MD4]],
member([_,_,matt,cat,_],S),
member([ALR,_,_,_,bear],S),
(ALR =:= 1 ; ALR =:= 2),
not(member([1,_,vince,_,_],S)),
member([VN,_,vince,_,_],S),
member([PS,_,_,_,prince],S),
VN < PS ,
member([_,_,chuck,witch,donald],S),
not(member([_,sue,_,witch,_],S)),
member([MRY,mary,_,_,_],S),
member([LOU,_,lou,_,_],S),
member([SUE,sue,_,_,_],S),
MRY > LOU,
MRY < SUE,
member([GPS,_,_,gipsy,_],S),
member([ANN,ann,_,_,_],S),
GPS < ANN ,
not(member([_,_,_,gipsy,batman],S)),
not(member([_,ann,_,_,batman],S)),
member([SW,_,_,snowwhite,_],S),
member([TS,tess,_,_,_],S),
SW > TS ,
perm([sue,mary,ann,tess],[L1,L2,L3,L4]),
perm([matt,lou,vince,chuck],[M1,M2,M3,M4]),
perm([cat,witch,gipsy,snowwhite],[LD1,LD2,LD3,LD4]),
perm([donald,prince,batman,bear],[MD1,MD2,MD3,MD4]).
takeout(X,[X|R],R).
takeout(X,[F|R],[F|S]) :- takeout(X,R,S).
perm([],[]).
perm([X|Y],Z) :- perm(Y,W), takeout(X,Z,W).
Любое решение?
1 ответ
Вы должны переместить все свои not(...)
цели до самого конца предиката.
not(G)
средства, " G
невозможно удовлетворить прямо сейчас ". При слишком раннем попытках, когда в списках есть еще много неинстанцированных переменных, на самом деле очень часто удается достичь цели, и все not(...)
вызов не удастся сразу.
В качестве альтернативы, отложите проверку неравенства для переменной до ее создания, например, в SWI Prolog с freeze/2
(как видно, например, в этом ответе).