Prolog逻辑难题失败
我试图解决这里的逻辑难题: 以下是线索:Prolog逻辑难题失败,prolog,zebra-puzzle,Prolog,Zebra Puzzle,我试图解决这里的逻辑难题: 以下是线索: 这些花是按以下顺序购买的:郁金香、办公室用花、紫色花、公园用玫瑰和朱莉娅买的白花 贝瑟尼喜欢花,但对花过敏,所以她永远不会在室内养花 星期三和星期五下雨了,因此,婚礼和生日聚会不得不搬到室内 艾米在瑞秋之后,但在克里斯汀之前买了花 瑞秋需要更多的东西来增加她的办公室,所以她选择了桃花来搭配她的窗帘 星期三,花店里仅有的紫色花朵是雏菊 粉红色的花是在康乃馨之后买的,但在百合花之前 生日花是在办公室花之后,但在婚礼花之前买的 我试图用以下代码
/*
Use a nested predicate of flowers to store the solution
flowers(
f(Woman1,Flower1,Color1,Place1,Day1),
f(Woman2,Flower2,Color2,Place2,Day2),
f(Woman3,Flower3,Color3,Place3,Day3),
f(Woman4,Flower4,Color4,Place4,Day4),
f(Woman5,Flower5,Color5,Place5,Day5)
).
*/
/* The flowers predicate contains a given flower X */
has(X,F) :- F=flowers(X,_,_,_,_).
has(X,F) :- F=flowers(_,X,_,_,_).
has(X,F) :- F=flowers(_,_,X,_,_).
has(X,F) :- F=flowers(_,_,_,X,_).
has(X,F) :- F=flowers(_,_,_,_,X).
/*Defines that X occurs on an earlier day than Y */
before(X,Y,F) :- append(_,[X|Tail], F), append(_,[Y|_],Tail).
solve(F) :-
F = flowers(A,B,C,D,E),
/*clue 1 */
A = f(_,tulips,yellow,_,monday),
B = f(_,_,_,office,tuesday),
C = f(_,_,purple,_,wednesday),
D = f(_,roses,_,park,thursday),
E = f(julia,_,white,_,friday),
/* Clue 2 --> Look @ clue 3, Bethany can only have flowers in backyard or park */
has(f(bethany,_,_,backyard,_),F),
has(f(bethany,_,_,_,park,_),F),
/* Clue #4, Amy before Kristen, Rachel before Amy */
before(f(amy,_,_,_,_),f(kristen,_,_,_,_),F),
before(f(rachel,_,_,_,_),f(amy,_,_,_,_),F),
/* Clue #5 */
has(f(rachel,_,peach,office,_),F),
/* Clue #6 */
has(f(_,daisies,purple,_,wednesday),F),
/* Clue #7, pink before lillies, carnations before pink */
before(f(_,_,pink,_,_),f(_,lilies,_,_,_),F),
before(f(_,carnations,_,_,_),f(_,_,pink,_,_),F),
/* Clue #8 */
before(f(_,_,_,birthday,_),f(_,_,_,wedding,_),F),
before(f(_,_,_,office,_),f(_,_,_,birthday,_),F).
这似乎不起作用。我相信问题要么是我的代码在定义一朵花时比另一朵花先出现,但我不确定这是否是问题所在,以及如何补救。此外,我认为说贝瑟尼为后院或公园(不是婚礼、生日或办公室)买花也有问题
以下是谜题的答案:
朱莉娅:百合花,白色,婚礼,星期五
艾米:雏菊,紫色,生日,星期三
贝瑟尼:郁金香,黄色,后院,星期一
康乃馨,桃子,办公室,星期二
克里斯汀:玫瑰,粉红,公园,星期四
您在/3之前
谓词试图处理花(A、B、C、D、E)
就好像它是一个列表一样。它总是失败。您需要将其定义为[A、B、C、D、E]
,它才能工作
如果您将flowers(A,B,C,D,E)
更改为[A,B,C,D,E]
,这样您就可以使用内置谓词member/2
而不是has/2
因此,首先我做了以下工作:
writeln(X) :- write(X), nl.
writelist([]).
writelist([H|T]) :- writeln(H), writelist(T).
/*Defines that X occurs on an earlier day than Y */
before(X,Y,F) :- append(F0, F1, F), member(X, F0), member(Y, F1).
你还想说贝瑟尼在后院和公园里。它需要是一个或关系
这是我的solve/1
版本:
solve(F) :-
/*clue 1 */
F = [
f(_,tulips,yellow,_,monday),
f(_,_,_,office,tuesday),
f(_,_,purple,_,wednesday),
f(_,roses,_,park,thursday),
f(julia,_,white,_,friday)
],
/* Clue 2 --> Look @ clue 3, Bethany can only have flowers in backyard or park */
(member(f(bethany,_,_,backyard,_),F);
member(f(bethany,_,_,_,park,_),F)),
/* Clue #4, Amy before Kristen, Rachel before Amy */
before(f(amy,_,_,_,_),f(kristen,_,_,_,_),F),
before(f(rachel,_,_,_,_),f(amy,_,_,_,_),F),
/* Clue #5 */
member(f(rachel,_,peach,office,_),F),
/* Clue #6 */
member(f(_,daisies,purple,_,wednesday),F),
/* Clue #7, pink before lillies, carnations before pink */
before(f(_,_,pink,_,_),f(_,lilies,_,_,_),F),
before(f(_,carnations,_,_,_),f(_,_,pink,_,_),F),
/* Clue #8 */
before(f(_,_,_,birthday,_),f(_,_,_,wedding,_),F),
before(f(_,_,_,office,_),f(_,_,_,birthday,_),F),
true.
现在当我查询?-solve(F),writelist(F)。
我得到:
f(bethany, tulips, yellow, backyard, monday)
f(rachel, carnations, peach, office, tuesday)
f(amy, daisies, purple, birthday, wednesday)
f(kristen, roses, pink, park, thursday)
f(julia, lilies, white, wedding, friday)
Yes.
f(贝瑟尼,郁金香,黄色,后院,星期一)
f(瑞秋、康乃馨、桃子、办公室,星期二)
f(艾米,黛西,紫色,生日,星期三)
f(克里斯汀、玫瑰、粉红、公园、星期四)
f(朱莉娅、百合花、白色、婚礼、星期五)
对
你是说has(f(bethany,,,,,,,,,,,后院,,),f)
has(f(bethany,,,,,,,,,,,),f)
必须成功——两者都要成功。不要把你的问题简单化,尤其是已经解决的问题。(我不明白为什么Stackoverflow在最后一次编辑时没有“回滚”操作。这有什么意义?这可能是一个UI故障,应该说“回滚到”,而不是隐含的“回滚到此”)@DavidTonhofer你是对的,文本令人困惑。它的意思是“回滚到此”。有(X,F):-函子(F,flowers,5),arg(u,F,X)。
。如果你用F=flowers(A,B,C,D,E)开始你的solve/1
,你甚至可以省略身体中的第一个目标,就像你实际做的那样。然后,在(X,Y,F)之前,:-arg(I,F,X),arg(J,F,Y),I