爱因斯坦之谜 [英] Einstein Riddle with List of terms

查看:92
本文介绍了爱因斯坦之谜的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Prolog中实施了爱因斯坦·里德尔(Einstein Riddle),试图找出谁在家里有鱼.
我找不到此代码中的错误,并且跟踪选项无法解决此问题;)

I implemented Einstein Riddle in Prolog and I'm trying to find out who had a fish at home.
I can't find fault in this code and trace option is not helping with this problem ;)

规则:

  1. 挪威人住在第一所房屋
  2. 英国人住在一所红房子里.
  3. 绿色房子直接位于白色房子的左侧.
  4. 丹麦人喝茶.
  5. 吸烟者住在猫的饲养员旁边.
  6. 黄房子里的居民抽雪茄.
  7. 德国人抽水烟斗.
  8. 中心房屋的居民喝牛奶.
  9. 抽烟的人有一个邻居喝水.
  10. 没有过滤嘴繁殖鸟的烟.
  11. 瑞典犬.
  12. 挪威人住在蓝房子旁边.
  13. 马的饲养者住在黄色的房子旁边.
  14. 吸薄荷饮料的啤酒.
  15. 他们在温室里喝咖啡.
  1. Norwegian lives in first house
  2. The Englishman lives in a red house.
  3. The green house is located directly on the left side of the white house.
  4. Dane drink tea.
  5. Light smoker lives next to the breeders of cats.
  6. A resident of the yellow house smokes a cigar.
  7. German smokes a water-pipe.
  8. A resident of the center house drinks milk.
  9. Light smoker has a neighbor who drink the water.
  10. Smoke cigarettes without filter breeding birds.
  11. Swede bred dogs.
  12. The Norwegian lives next to the blue house.
  13. Breeder of horses lives next to the yellow house.
  14. Smoke menthol drink beer.
  15. In the green house they drink coffee.

这是我的代码:

on_the_left(X, Y, N) :-
    Y is X - 1,
    \+ Y < 1,
    \+ X > N.

next_to(X, Y, N) :-
    ( Y is X + 1;
      Y is X - 1),
    \+ X > N,
    \+ Y > N,
    \+ X < 1,
    \+ Y < 1.

fish(Who) :-
    Houses = [
        house(1, _Color1, _From1, _Animal1, _Drink1, _Smoke1),
        house(2, _Color2, _From2, _Animal2, _Drink2, _Smoke2),
        house(3, _Color3, _From3, _Animal3, _Drink3, _Smoke3),
        house(4, _Color4, _From4, _Animal4, _Drink4, _Smoke4),
        house(5, _Color5, _From5, _Animal5, _Drink5, _Smoke5) ],
    N is 5,
    %-- hint 1
    member(house(1, _, norway, _, _, _), Houses),
    %-- hint 2
    member(house(_, red, england, _, _, _), Houses),
    %-- hint 3 - on_the_left
    member(house(GREEN, green, _, _, _, _), Houses),
    member(house(WHITE, white, _, _, _, _), Houses),
    on_the_left(GREEN, WHITE, N),
    %-- hint 4
    member(house(_, _, denmark, _, tea, _), Houses),
    %-- hint 5 - next_to
    member(house(LIGHT, _, _, _, _, light), Houses),
    member(house(CAT, _, _, cat, _, light), Houses),
    next_to(LIGHT, CAT, N),
    %-- hint 6
    member(house(_, yellow, _, _, _, cigar), Houses),
    %-- hint 7
    member(house(_, _, germany, _, _, waterpipe), Houses),
    %-- hint 8
    member(house(3, _, _, _, milk, _), Houses),
    %-- hint 9 - next_to
    member(house(WATER, _, _, _, water, _), Houses),
    next_to(LIGHT, WATER, N),
    %-- hint 10
    member(house(_, _, _, bird, _, nofilter), Houses),
    %-- hint 11
    member(house(_, _, sweden, dog, _, _), Houses),
    %-- hint 12 - next_to
    member(house(NORWAY, _, norway, _, _, _), Houses),
    member(house(BLUE, blue, _, _, _, _), Houses),
    next_to(NORWAY, BLUE, N),
    %-- hint 13 - next_to
    member(house(HORSE, _, _, horse, _, _), Houses),
    next_to(HORSE, GREEN, N),
    %-- hint 14
    member(house(_, _, _, _, beer, menthol), Houses),
    %-- hint 15
    member(house(_, green, _, _, coffee, _), Houses),

    %-- FINAL QUESTION - WHO LET THE FISH OUT?
    member(house(_, _, _, fish, _, _), Houses),
    member(house(_, _, Who, fish, _, _), Houses).

我尝试了很多组合,但是:

I tried a lot of combination but:

?-鱼(谁).
错误.

?- fish(Who).
false.


代码现在可以正常工作了,我所做的更改:


Code is working now, what i changed:

1 *发件人:

%-- hint 5 - next_to
member(house(LIGHT, _, _, _, _, light), Houses),
member(house(CAT, _, _, cat, _, light), Houses),

收件人:

%-- hint 5 - next_to
    member(house(LIGHT, _, _, _, _, light), Houses),
    member(house(CAT, _, _, cat, _, _), Houses),

2 *发件人:

%-- hint 13 - next_to   
member(house(HORSE, _, _, horse, _, _), Houses),
next_to(HORSE, GREEN, N),

收件人:

%-- hint 13 - next_to
member(house(YELLOW, yellow, _, _, _, _), Houses),
member(house(HORSE, _, _, horse, _, _), Houses),
next_to(HORSE, YELLOW, N),

如果您正在阅读此文章,请参阅@Enigmativity关于辅助谓词中结构的评论.

If you are reading this look at @Enigmativity comment about structures in helper predicates aswell.

推荐答案

您的线索有两个错误-第一个错误已由light吸烟者解决.第二个原因是horse所有者住在yellow房子旁边,而不是green.

You had two errors in your clues - the first you fixed already with the light smoker. The second is that the horse owner lives next to the yellow house, not the green.

现在,我的序言被\+运算符所阻塞,因此我重新编码了您的辅助谓词.这就是我所做的:

Now, my prolog choked on the \+ operator so I recoded your helper predicates. This is what I did:


first(H,[H|_]).

on_the_left(X,Y,[X,Y|_]).
on_the_left(X,Y,[_|Hs]) :- on_the_left(X,Y,Hs).

next_to(X,Y,[X,Y|_]).
next_to(X,Y,[Y,X|_]).
next_to(X,Y,[_|Hs]) :- next_to(X,Y,Hs).

middle(X,[_,_,X,_,_]).

现在,这些线索可以很好地配合这些线索:

Now the puzzle worked nicely with these clues:


fish(Who) :-
    Houses = [
        house(_Color1, _From1, _Animal1, _Drink1, _Smoke1),
        house(_Color2, _From2, _Animal2, _Drink2, _Smoke2),
        house(_Color3, _From3, _Animal3, _Drink3, _Smoke3),
        house(_Color4, _From4, _Animal4, _Drink4, _Smoke4),
        house(_Color5, _From5, _Animal5, _Drink5, _Smoke5) ],
    first(house(_, norway, _, _, _), Houses), %-- hint 1
    member(house(red, england, _, _, _), Houses), %-- hint 2
    on_the_left(house(green, _, _, _, _), house(white, _, _, _, _), Houses), %-- hint 3 - on_the_left
    member(house(_, denmark, _, tea, _), Houses), %-- hint 4
    next_to(house(_, _, _, _, light), house( _, _, cat, _, _), Houses), %-- hint 5 - next_to
    member(house(yellow, _, _, _, cigar), Houses), %-- hint 6
    member(house(_, germany, _, _, waterpipe), Houses), %-- hint 7
    middle(house(_, _, _, milk, _), Houses), %-- hint 8
    next_to(house(_, _, _, _, light), house(_, _, _, water, _), Houses), %-- hint 9 - next_to
    member(house(_, _, bird, _, nofilter), Houses), %-- hint 10
    member(house(_, sweden, dog, _, _), Houses), %-- hint 11
    next_to(house(_, norway, _, _, _), house(blue, _, _, _, _), Houses), %-- hint 12 - next_to
    next_to(house(_, _, horse, _, _), house(yellow, _, _, _, _), Houses), %-- hint 13 - next_to
    member(house(_, _, _, beer, menthol), Houses), %-- hint 14
    member(house(green, _, _, coffee, _), Houses), %-- hint 15
    member(house(_, Who, fish, _, _), Houses),
    write(Houses), nl.

我得到了:


[house(yellow, norway, cat, water, cigar), house(blue, denmark, horse, tea, light), house(red, england, bird, milk, nofilter), house(green, germany, fish, coffee, waterpipe), house(white, sweden, dog, beer, menthol)]
germany

这篇关于爱因斯坦之谜的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆