首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog使用列表中的逻辑难题

Prolog使用列表中的逻辑难题
EN

Stack Overflow用户
提问于 2016-04-15 15:50:38
回答 1查看 232关注 0票数 2

我试图在Prolog中解决以下问题,并且我认为我已经正确地编码了它,但是我的查询只是返回false。有什么改变的建议吗?问题如下:

“百吉饼巷,当地的百吉饼店,总是在早上通勤的时候进行激烈的活动,因为人们在上班的路上顺便过来拿咖啡和百吉饼。每天早上现场新鲜,百吉饼非常受欢迎,商店也有很好的咖啡,就像蛋糕上的糖霜!在百吉饼巷工作的人是愉快的,友好的,也是能干的,因此,尽管有大量的顾客,等待的时间并不长,也不令人不快。乔和他的四位同事今天早上来看了看大家都在胡说八道的事情,并惊喜地发现这家商店名副其实。确定每一位同事的名字,哪种百吉饼配上它的配料,以及每一份咖啡(小、中、大)的味道和大小。“

  1. 布拉德得到了他的百吉饼,那不是小麦,上面什么也没有。沃尔特点了一小杯咖啡。
  2. 这两位同事买的是中等大小的咖啡,一位是榛子口味的,另一位是用花生酱做成的百吉饼。
  3. 得到洋葱百吉饼但不加黄油的人,也有法国香草咖啡,但不是小尺寸的。
  4. 这五位同事是乔,他喝了一大杯咖啡,有阿马雷托风味的咖啡,有小麦百吉饼,还有他的百吉饼上有鸡蛋和培根。
  5. 瑞克没有点蓝莓百吉饼,但他确实买了哥伦比亚咖啡。阿马雷托咖啡是用切达百吉饼点的,但不是沃尔特点的。
  6. 奶油奶酪没有和蓝莓百吉饼一起来,但它确实有一大杯咖啡。芝麻百吉饼里有黄油,但卡洛斯没有点。

我编写的Prolog代码如下:

代码语言:javascript
复制
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)”。应该给我解决问题的办法,但它会返回假的。我是不是遗漏了什么?事先非常感谢!

EN

回答 1

Stack Overflow用户

发布于 2016-04-16 18:45:08

我试图提高可读性,使用DCG来传递状态(在此页中查找“隐式传递状态”),因此这个片段与您的解决方案非常不同。

你可以看到,消极的知识有两种不同的方式:在涉及到人的地方,我们可以直接使用\=,因为名称总是被实例化,但是对于其他值,比如kind(brad, K),我使用{dif(K, wheat)},因为K还不能被实例化。

代码语言:javascript
复制
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一样

代码语言:javascript
复制
?- aggregate(count,S^bagels(S),N).
N = 7.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36651637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档