Prolog - 爱因斯坦之谜

时间:2016-04-24 06:49:26

标签: prolog zebra-puzzle

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

  • 在公寓楼是5个单位。 (一楼1.,2.,3.,4楼)
  • 家庭Mullerovi有4个孩子。
  • 管理员住在中间层。
  • MRS。 Meierova支付她的平面60克朗比3楼的医生少。
  • 居住在最高楼层的家庭有5个孩子。
  • 家庭Kernovi有一个孩子而不是老师。
  • Kaufmann先生是销售代表。
  • 老师支付她的公寓1740克朗。
  • 在最高层的看门人生活。
  • 医生支付他的公寓1800克朗。
  • 在公寓里,花费1760克朗,不是任何孩子。
  • 在2.floor上,家庭在3.floor上的孩子多于家庭两倍。
  • 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).

感谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

“在公寓楼是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,应尽可能放在谓词中,以获得最大效率。