在Prolog中拼图

时间:2014-12-20 12:56:46

标签: prolog zebra-puzzle

任何人解决这个难题:

使用给出的线索计算出每个人的名字,葡萄酒,主菜和价格。    以下是此谜题中使用的所有类别和选项。

名字:Lynda,Nick,Robin,Virginia    葡萄酒:波尔多,基安蒂,梅鹿辄,设拉子    主菜:牛肉炒,柑橘鸡,菲力牛排,红鲷鱼    价格:24.99美元,25.99美元,26.99美元,27.99美元

线索:

  1. 订购红鲷鱼的用餐者没有波尔多葡萄酒。
  2. Lynda的薪水低于波尔多人。
  3. 波尔多人和拥有基安蒂的人都不是支付26.99美元的人。
  4. 订购牛肉炒菜的晚餐有chianti。
  5. 订购柑橘鸡的用餐者比拥有chianti的人少1美元。
  6. 订购菲力牛排的用餐者比拥有设拉子的人少付钱。
  7. 弗吉尼亚要么是订购牛肉炒菜的用餐者,要么是订购红鲷鱼的用餐者。
  8. 梅尔的人比罗宾少了1美元。
  9. 来源:

    logic-puzzles.org

1 个答案:

答案 0 :(得分:2)

  

找出每个人的名字,葡萄酒,主菜和价格

所以我们将每个人都表示为4-ary复合词,p(Name,Wine,Entree,Price)。似乎也有四个。

然后我们写下我们被告知的内容:

wine_and_dine(People):-
  length(People,4),
  Ordered1 = p(_,W1,red_snapper,_),   
             member(Ordered1, People),
             % W1 \= bordeaux, but delay writing this down 
             %                 until it is defined some more
             % or use freeze/2 in SWI:
             freeze( W1, W1 \= bordeaux),
  Lynda2 = p(lynda,_,_,PL2), 
             Had2 = p(_,bordeaux,_,PB2),
             member(Lynda2, People),
             member(Had2, People),
             % PL2 < PB2,     % check this only when they are known; or
             freeze(PL2, freeze(PB2, PL2 < PB2)),
  .... etc.

请参阅标记上的问答。