Решение загадок Пролог

Заявление:

Всего четыре пары

Посетил костюмированный бал.

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 (как видно, например, в этом ответе).

Другие вопросы по тегам