爱因斯坦之谜与术语列表

时间:2016-04-20 12:15:39

标签: prolog zebra-puzzle

我在Prolog中实施了爱因斯坦之谜,我试图找出谁在家里养了一条鱼 我无法在此代码中找到错误,并且跟踪选项无法解决此问题;)

规则:

  1. 挪威人居住在第一宫
  2. 英国人住在一幢红房子里。
  3. 温室直接位于白宫的左侧。
  4. Dane喝茶。
  5. 轻度吸烟者生活在猫的饲养员旁边。
  6. 黄屋的居民抽雪茄。
  7. 德国人抽了一根水管。
  8. 中心住宅的居民喝牛奶。
  9. 轻度吸烟者有一个喝水的邻居。
  10. 没有过滤繁殖鸟类的香烟。
  11. 瑞典人养殖的狗。
  12. 挪威人住在蓝屋旁边。
  13. 马的饲养员住在黄屋旁边。
  14. 烟薄荷醇饮料啤酒。
  15. 在温室里,他们喝咖啡。
  16. 这是我的代码:

    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).
    

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

      

    ? - 鱼(谁)。
      假的。

    编辑:
    代码现在正在运行,我改变了:

    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注释的话。

2 个答案:

答案 0 :(得分:3)

您的线索中有两个错误 - 您已经使用light吸烟者修复过的第一个错误。第二个是horse所有者住在yellow住宅的旁边,而不是green

现在,我的prolog在\+运算符上ch咽,所以我重新编写了你的​​助手谓词。这就是我所做的:

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,_,_]).

现在这个难题与这些线索很好地协调了:

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

答案 1 :(得分:1)

仅显示替代编码方案:

solve :- solve(Sol, From), writeln(From), maplist(writeln, Sol).

solve(Sol, From) :-
    phrase( (from(1, norway)
        ,color(red) = from(england)
        ,color(GREEN, green), color(WHITE, white), {GREEN is WHITE-1}
        ,from(denmark) = drink(tea)
        ,smoke(Light, light), animal(Cat, cat), next_to(Light, Cat)
        ,color(Yellow, yellow), smoke(Yellow, cigar)
        ,from(germany) = smoke(waterpipe)
        ,drink(3, milk)
        ,drink(Water, water), next_to(Light, Water)
        ,animal(bird) = smoke(nofilter)
        ,from(sweden) = animal(dog)
        ,from(NORWAY, norway), color(BLUE, blue), next_to(NORWAY, BLUE)
        ,animal(HORSE, horse), next_to(HORSE, GREEN) % next_to(HORSE, Yellow)
        ,drink(beer) = smoke(menthol)
        ,color(green) = drink(coffee)
        ,animal(Fish, fish), from(Fish, From)
    ), [[1,_,_,_,_,_],
        [2,_,_,_,_,_],
        [3,_,_,_,_,_],
        [4,_,_,_,_,_],
        [5,_,_,_,_,_]
    ], Sol).

state(S), [A,B,C,D,E] --> [A,B,C,D,E], {member(S, [A,B,C,D,E])}.

color(A, B)  --> state([A,B,_,_,_,_]).
from(A, B)   --> state([A,_,B,_,_,_]).
animal(A, B) --> state([A,_,_,B,_,_]).
drink(A, B)  --> state([A,_,_,_,B,_]).
smoke(A, B)  --> state([A,_,_,_,_,B]).

X = Y --> {
    X=..[Fx|Ax], Y=..[Fy|Ay],
    Xs=..[Fx,S|Ax], Ys=..[Fy,S|Ay]
}, call(Xs), call(Ys).

next_to(X, Y) --> {1 is abs(X-Y)}.