我正在学习Prolog,但我遇到了这个问题而且我真的不知道如何完成它。我认为我的代码是正确的,但我一直在Sictus收到警告,而且我不知道我的错误在哪里。
问题在于:
/*
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拼图的一些例子来做到这一点。
答案 0 :(得分:0)
将程序的第一行更改为:
:- use_module(library(basics)).
:- use_module(library(lists)).
检查是否能解决问题。 use_module/1
是一个指令,必须这样写。
答案 1 :(得分:0)
你在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).