[英]Solving a Logic Puzzle in Prolog
我正在學習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).
我用斑馬拼圖的一些例子來做。
將程序的第一行更改為:
:- 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).
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.