解决Prolog中的逻辑谜题

时间:2011-01-17 18:00:10

标签: prolog zebra-puzzle

我正在阅读“现在学习Prolog”,其中一项我无法解决的练习如下:

  

有三条街   邻近的房子都有一个   不同的颜色。它们是红色,蓝色,   和绿色。不同的人   民族生活在不同的地方   房子和他们都有不同的   宠物。这里有一些更多的事实   它们:

     
      
  • 英国人住在红房子里。
  •   
  • 美洲虎是西班牙家庭的宠物。
  •   
  • 日本人住在蜗牛门的右边。
  •   
  • 蜗牛守护者住在蓝屋的左边。
  •   
     

谁养斑马?

     

定义一个谓词zebra/1,告诉您斑马主人的国籍。

     

提示:想想房屋和街道的代表。编写Prolog中的四个约束。 membersublist可能是有用的谓词。

如何在Prolog下编写代码?感谢。

2 个答案:

答案 0 :(得分:8)

neigh(Left, Right, List) :- 
        List = [Left | [Right | _]];
        List = [_ | [Left | [Right]]].

zebraowner(Houses, ZebraOwner):-
        member([englishman, _, red], Houses),
        member([spanish, jaguar, _], Houses),
        neigh([_, snail, _], [japanese, _, _], Houses),
        neigh([_, snail, _], [_, _, blue], Houses),
        member([ZebraOwner, zebra, _], Houses),
        member([_, _, green], Houses).


zebra(X) :- zebraowner([_, _, _], X).

答案 1 :(得分:2)

我是Prolog的新手,但我认为neigh的定义不太正确。试试:

   neigh(2,3,[1,2,3]).

你逃脱这个不太合适,因为有两个解决方案,一个在日常拥有的斑马在第二宫,一个与斑马在第三宫,你的代码只找到一个(这足以回答题 :-)。 这段代码为neigh提供了正确的答案,因此也解决了问题:

neigh(Left, Right, List) :- 
        List = [Left, Right ,_];
        List = [_, Left, Right]].

但只适用于三个房子。更一般的实现是:

neigh(Left, Right, List) :- 
        List = [Left , Right | _].
neigh(Left, Right, [_|Tail]) :- 
        neigh(Left, Right, Tail).