简体   繁体   中英

Solving a Logic Puzzle in Prolog

I'm learning Prolog, but I got stuck with this problem and I really don't know how to finish it. I thought that I was right in my code, but I keep getting warnings in Sictus, and I don't know where my mistake is.

Here's the problem:

/*
    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.
*/

And here is my code:

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).

I used some examples of the Zebra puzzle to do it.

Change the first line of your program to:

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

Check if that solves the problem. use_module/1 is a directive and must be written as such.

You somehow missed many commas in the end of your constrains/1 predicate. This will produce a lot of error when trying to run the file.

It should be like that:

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).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM