我正在尝试解决此处的逻辑难题:https://www.braingle.com/brainteasers/teaser.php?id=23826&op=2&comm=1#c
这些是线索:
这些花是按以下顺序购买的:郁金香,办公室用花,紫色花,公园用玫瑰和茱莉亚购买的白花。
伯大尼(Bethany)喜欢花,但对花过敏,因此她永远不会把它们放在室内。
周三和周五下雨,因此,婚礼和生日聚会必须移到室内。
艾米在蕾切尔(Rachel)之后但在克里斯汀(Kristen)之前买了花。
蕾切尔(Rachel)需要在她的办公室增加一些东西,所以她选择了桃花来搭配她的窗帘。
在星期三,花店里唯一的紫色花是雏菊。
粉红色的花朵是在康乃馨之后但在百合花之前购买的。
生日花是在办公室用花之后买的,婚礼前是买的。
我尝试使用以下代码在序言中实现此目的:
/*
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).
这似乎不起作用。我相信问题出在我的代码中,即定义一朵花出现在另一朵花之前,但是我不确定这是否是问题所在以及如何补救。另外,我认为说伯大尼是在后院或公园买花(不是婚礼,生日或办公室)是有问题的。
这是难题的答案:
朱莉娅:百合,白色,婚礼和星期五
艾米:雏菊,紫色,生日,星期三
伯大尼:郁金香,黄色,后院,星期一
瑞秋:康乃馨,桃子,办公室,星期二
克里斯汀:玫瑰,粉红,公园,星期四
答案 0 :(得分:1)
您before/3
的谓词试图像对待flowers(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).
您还试图在后院和公园里说伯大尼。它必须是or
关系。
这是我的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.