我试图在Prolog中解决以下问题,并且我认为我已经正确地编码了它,但是我的查询只是返回false。有什么改变的建议吗?问题如下:
“百吉饼巷,当地的百吉饼店,总是在早上通勤的时候进行激烈的活动,因为人们在上班的路上顺便过来拿咖啡和百吉饼。每天早上现场新鲜,百吉饼非常受欢迎,商店也有很好的咖啡,就像蛋糕上的糖霜!在百吉饼巷工作的人是愉快的,友好的,也是能干的,因此,尽管有大量的顾客,等待的时间并不长,也不令人不快。乔和他的四位同事今天早上来看了看大家都在胡说八道的事情,并惊喜地发现这家商店名副其实。确定每一位同事的名字,哪种百吉饼配上它的配料,以及每一份咖啡(小、中、大)的味道和大小。“
我编写的Prolog代码如下:
bagels(Sol):-
Sol = [[_,_,_,_,_],[_,_,_,_,_],[_,_,_,_,_],[_,_,_,_,_],[_,_,_,_,_]],
member([brad,X,plain,_,_], Sol), X \== wheat,
member([walt,_,_,small,_], Sol),
member([_,_,_,medium1,hazelnut], Sol),
member([_,_,peanut_butter,medium2,_], Sol),
member([_,onion,Y,Z,french_vanilla], Sol), Y \== butter, Z \== small,
member([joe,Ja,Jb,Jc,Jd], Sol),Ja\==wheat,Jb\==egg_bacon,Jc\==large,Jd==amaretto,
member([La,Lb,Lc,large,Ld], Sol), La\==joe,Lb\==wheat,Lc\==egg_bacon,Ld\==amaretto,
member([Aa,Ab,Ac,Ad,amaretto], Sol), Aa\==joe,Ab\==wheat,Ac\==egg_bacon,Ad\==large,
member([Wa,wheat,Wb,Wc,Wd], Sol), Wa\==joe,Wb\==egg_bacon,Wc\==large,Wd\==amaretto,
member([Ea,Eb,egg_bacon,Ec,Ed], Sol), Ea\==joe,Eb\==wheat,Ec\==large,Ed\==amaretto,
member([rick,R,_,_,columbian], Sol),R\==blueberry,
member([A,cheddar,_,_,amaretto], Sol), A\==walt,
member([_,B,cream_cheese,large,_], Sol), B\==blueberry,
member([C,sesame,butter,_,_], Sol), C \== carlos,
member([_,_,_,other,_], Sol),
member([_,_,_,_,other], Sol).我相信运行查询“百吉饼(X)”。应该给我解决问题的办法,但它会返回假的。我是不是遗漏了什么?事先非常感谢!
发布于 2016-04-16 18:45:08
我试图提高可读性,使用DCG来传递状态(在此页中查找“隐式传递状态”),因此这个片段与您的解决方案非常不同。
你可以看到,消极的知识有两种不同的方式:在涉及到人的地方,我们可以直接使用\=,因为名称总是被实例化,但是对于其他值,比如kind(brad, K),我使用{dif(K, wheat)},因为K还不能被实例化。
state(S), [state(T)] --> [state(T)], {member(S, T)}.
kind(P, K) --> state([P, K, _, _, _]).
topping(P, T) --> state([P, _, T, _, _]).
flavor(P, F) --> state([P, _, _, F, _]).
size(P, S) --> state([P, _, _, _, S]).
hint1 -->
kind(brad, K), {dif(K, wheat)}, topping(brad, plain), size(walt, small).
hint2 -->
size(P1, medium), size(P2, medium), {P1 \= P2},
flavor(P1, hazelnut), topping(P2, peanut_butter).
hint3 -->
kind(P, onion), flavor(P, french_vanilla), size(P, S), {dif(S, small)}.
hint4 -->
size(P1, large), flavor(P2, amaretto), kind(P3, wheat), topping(P4, egg_bacon),
{forall(select(X, [joe,P1,P2,P3,P4], Ps), maplist(\=(X), Ps))}.
hint5 -->
kind(rick, K), {dif(K, blueberry)}, flavor(rick, columbian),
kind(P, cheddar), flavor(P, amaretto), {P \= walt}.
hint6 -->
topping(P1, cream_cheese), kind(P2, blueberry), {P1 \= P2}, size(P1, large),
kind(P, sesame), topping(P, butter), {P \= carlos}.
bagels(Sol):- Sol =
[[brad,_,_,_,_],
[walt,_,_,_,_],
[joe,_,_,_,_],
[rick,_,_,_,_],
[carlos,_,_,_,_]],
phrase((hint1, hint2, hint3, hint4, hint5, hint6), [state(Sol)], _).唉,我有太多的解决办法了.也许我的提示翻译中有一个错误,或者all_different也应该应用于所有属性,就像提示n.4一样
?- aggregate(count,S^bagels(S),N).
N = 7.https://stackoverflow.com/questions/36651637
复制相似问题