【问题标题】:Prolog - Einstein RiddleProlog - 爱因斯坦之谜
【发布时间】:2016-04-24 06:49:26
【问题描述】:

我正在尝试使用 Prolog 解决爱因斯坦谜语。对不起我的英语。任务是:

  • 公寓楼中有 5 个公寓。 (一楼一、二、三、四楼)
  • 穆列罗维家族有 4 个孩子。
  • 管理员住在中间楼层。
  • 夫人Meierova 支付的费用比 3. 楼的医生少 60 克朗。
  • 住在最高楼层的家庭有 5 个孩子。
  • Kernovi 家比老师多了 1 个孩子。
  • 考夫曼先生担任销售代表。
  • 老师为她平平的 1740 克朗付钱。
  • 看门人住在最高楼层。
  • 医生支付了他平坦的 1800 牙冠。
  • 在花费 1760 克朗的公寓里,没有孩子。
  • 二楼家庭的孩子是三楼家庭的两倍。
  • Hanz 先生住在 Kernovi 家族的正上方。
  • 在看门人下面的公寓里住着 2 个孩子。
  • Mullerovi 为他们的扁平 1770 牙冠买单。
  • 屋顶平台比底层便宜 10 克朗。
  • 销售代表比看门人多付 30 克朗。

我的代码看起来像,我不知道如何解决雇佣问题:

person('Name', 'Job','Children','Hire','Floor').

houses(Hs):-
   length(Hs),
   member(person(mullerovi,_,4,1770,_),Hs),
   member(person(_,administrator,_,_,2),Hs),
   member(person(_,doctor,_,1800,_),Hs),
   pays_less(person(_,doctor,_,Hire,_),person('Meinova',_,_,Hire-60,_),Hs),
   member(person(_,_,5,_,4),Hs),
   have_one_children_less(person('Kernovi',_,Children-1,_,_),person(_,teacher,Children,_,_),Hs),
   member(person('Kaufmann','Sales representative',_,_,_),Hs),
   member(person(_,teacher,_,1740,_),Hs),
   member(person(_,janitor,_,_,4),Hs),
   member(person(_,_,0,1760,_),Hs),
   have_2x_children(
         person(_,_,2*Children,_,2),
         person(_,_,Children,_,3),Hs),
   lives_above(person('Hanz',_,_,_,_),person('Kernovi',_,_,_,_),Hs),
   lives_above(person(_,janitor,_,_,_),person(_,_,2,_,_),Hs),
   pays_more(
         person(_,_,_,Hire+10,4),
         person(_,_,_,Hire,'Ground floor'),Hs),
   pays_more(
         person(_,'Sale representative',_,Hire+30,_),
         person(_,janitor,_,Hire,_),Hs).

感谢您的任何建议。

【问题讨论】:

  • 您假设 prolog 将在算术上评估 Hire+10。它没有。它试图以X+Y 的形式统一一个术语。 Prolog 进行结构评估,而不是算术。
  • 您的意思是创建一个新规则吗?我是 Prolog 的新手。
  • length(Hs), 毫无意义。你真的需要先付出更多的努力。
  • @WillNess 所以你正在开始你自己的 CLP 实现 :-)

标签: prolog zebra-puzzle


【解决方案1】:

“公寓楼中有 5 个公寓” 翻译为 length(Hs,5)

那么,pays_less( person(_,doctor,_,Hire,_), person('Meinova',_,_,Hire-60,_),Hs) 是未定义的;应该是

.....
member( person(_,doctor,_,Hire,_), Hs), 
member( person('Meinova',_,_,Hire2,_), Hs), 
.....
Hire2 is Hire-60,  
.....

或类似的东西。

熟悉is/2 运算符及其前置条件。 B=80, A = B-60 成功,将A-(80,60) 统一起来。您希望 B=80, A is B-60 成功并将 A20 统一(但如果 B 还不是数字表达式,则会失败)。

Hire2 is Hire-60, 行应该放在谓词中尽可能高的位置,以获得最大的效率。

【讨论】:

  • 宁可when( ( ground(Hire), ground(Hire2) ), Hire2 =:= Hire-60 )
猜你喜欢
  • 1970-01-01
  • 2011-05-24
  • 2018-01-31
  • 1970-01-01
  • 2016-12-20
  • 2016-08-17
  • 1970-01-01
  • 2015-09-15
  • 2012-06-22
相关资源
最近更新 更多