Решение логической головоломки в Прологе

Я изучаю Пролог, но я застрял с этой проблемой, и я действительно не знаю, как ее решить. Я думал, что я был прав в моем коде, но я продолжаю получать предупреждения в Сикте, и я не знаю, где моя ошибка.

Вот проблема:

/*
    File:       fall_dance_competition.pl
    Purpose:    Solve the Fall "Dance Competition" puzzle

    Notes:
    Saturday night, four couples went to the town’s annual fall dance 
    competition. Each couple dressed in matching colors and they all
    performed very well. The competition was fierce but friendly and
    everyone had a grand time. Determine the name of each couple, 
    their place in the competition, and the color each couple wore.

    1. Tom, who wasn’t married to Jean, placed better than Mary 
       and her husband but worse than the West couple did.
    2. The couple wearing brown won the event. Mr. and Mrs. 
       King came in 4th place.
    3. Bill Snow and his wife didn’t wear the green outfits. 
       Jean wasn’t married to John.
    4. The couple wearing blue placed after the couple wearing red 
       but before the King couple.
    5. From 4th place to 1st place, the couples won in the following 
       order: John and his wife, the
       couple wearing blue, Mr. and Mrs. Forest, Brenda and her husband.
    6. George and his wife placed better than Tom and Sara.
*/

И вот мой код:

use_module( library(basics)).use_module(library(lists)).

lista([pareja(_,_,_,_,_),pareja(_,_,_,_,_),
       pareja(_,_,_,_,_),pareja(_,_,_,_,_)]).

constraints( S ) :-      
    member(pareja(tom, _, _, _, _), S)
    member(pareja(_, jean, _, _, _), S)
    member(pareja(_, mary, _, _, _), S)
    member(pareja(_, _, west, _, _), S)
    perm2(Left_1, Right_1, pareja(tom, _, _, _, _), pareja(_, mary, _, _, _))
    nextto(Left_1, Right_1, S)
    perm2(Left_2, Right_2, pareja(_, _, west, _, _), pareja(tom, _, _, _, _))
    nextto(Left_2, Right_2, S)
    S = [pareja(_, _, _, 1, brown), _, _, _]
    S = [_, _, _, pareja(_, _, king, 4, _)]
    member(pareja(bill, _, snow, _, _), S)
    member(pareja(_, _, _, _, green), S)
    member(pareja(john, _, _, _, _), S)
    nextto(pareja(_, _, _, _, red), pareja(_, _, _, _, blue), S)
    nextto(pareja(_, _, _, _, blue), pareja(_, _, king, _, _), S)
    S = [_, _, _, pareja(john, _, _, 4, _)]
    S = [_, _, pareja(_, _, _, 3, blue), _]
    S = [_, pareja(_, _, forest, 2, _), _, _]
    S = [pareja(_, brenda, _, 1, _), _, _, _]   
    member(pareja(george, _, _, _, _), S)
    member(pareja(tom, sara, _, _, _), S)
    nextto(pareja(george, _, _, _, _), pareja(tom, sara, _, _, _), S).

green( Who ) :-
    lista(S),
    constraints(S),
    member(pareja(_, Who, _, _, green), S). 

nextto(X, Y, List) :- append(_, [X,Y|_], List).

append([X|Y],Z,[X|W]) :- append(Y,Z,W).  
append([],X,X).

member(X,[X|T]).
member(X,[H|T]) :- member(X,T).

perm2(X,Y, X,Y).
perm2(X,Y, Y,X).

Я использовал несколько примеров головоломки Zebra, чтобы сделать это.

2 ответа

Измените первую строку вашей программы на:

:- use_module(library(basics)).
:- use_module(library(lists)).

Проверьте, решает ли это проблему. use_module/1 является директивой и должна быть написана как таковая.

Вы как-то пропустили много запятых в конце вашего constrains/1 сказуемое. Это приведет к большому количеству ошибок при попытке запустить файл.

Должно быть так:

constraints( S ) :-      
    member(pareja(tom, _, _, _, _), S),
    member(pareja(_, jean, _, _, _), S),
    member(pareja(_, mary, _, _, _), S),
    member(pareja(_, _, west, _, _), S),
    perm2(Left_1, Right_1, pareja(tom, _, _, _, _), pareja(_, mary, _, _, _)),
    nextto(Left_1, Right_1, S),
    perm2(Left_2, Right_2, pareja(_, _, west, _, _), pareja(tom, _, _, _, _)),
    nextto(Left_2, Right_2, S),
    S = [pareja(_, _, _, 1, brown), _, _, _],
    S = [_, _, _, pareja(_, _, king, 4, _)],
    member(pareja(bill, _, snow, _, _), S),
    member(pareja(_, _, _, _, green), S),
    member(pareja(john, _, _, _, _), S),
    nextto(pareja(_, _, _, _, red), pareja(_, _, _, _, blue), S),
    nextto(pareja(_, _, _, _, blue), pareja(_, _, king, _, _), S),
    S = [_, _, _, pareja(john, _, _, 4, _)],
    S = [_, _, pareja(_, _, _, 3, blue), _],
    S = [_, pareja(_, _, forest, 2, _), _, _],
    S = [pareja(_, brenda, _, 1, _), _, _, _],  
    member(pareja(george, _, _, _, _), S),
    member(pareja(tom, sara, _, _, _), S),
    nextto(pareja(george, _, _, _, _), pareja(tom, sara, _, _, _), S).
Другие вопросы по тегам