5

我正在阅读“立即学习 Prolog”,其中一个我自己无法解决的练习如下:

有一条街道,有三个相邻的房子,它们都有不同的颜色。它们是红色、蓝色和绿色。不同国籍的人住在不同的房子里,他们都有不同的宠物。以下是关于它们的更多事实:

  • 英国人住在红房子里。
  • 美洲虎是西班牙家庭的宠物。
  • 日本人住在蜗牛饲养员的右边。
  • 蜗牛饲养员住在蓝房子的左边。

谁养的斑马?

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

提示:考虑房屋和街道的表示。在 Prolog 中对四个约束进行编码。member并且sublist可能是有用的谓词。

任何想法如何在 Prolog 下对其进行编码?谢谢。

4

2 回答 2

7
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).
于 2011-01-17T19:27:32.267 回答
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).
于 2015-11-11T16:31:26.477 回答