在Prolog中解决逻辑谜题

5
我正在阅读《Learn Prolog Now》这本书,其中有一个练习我自己无法解决,它是这样的:
有一条街上有三栋相邻的房子,它们都是不同的颜色。它们是红色、蓝色和绿色的。不同国籍的人住在不同的房子里,他们都有不同的宠物。以下是关于他们的更多信息:
- 英国人住在红房子里。 - 西班牙家庭养了美洲豹。 - 日本人住在蜗牛饲养员右边。 - 蜗牛饲养员住在蓝房子左边。
谁养斑马?
定义一个谓词 zebra/1,告诉你斑马主人的国籍。
提示:想想房子和街道的表现形式。用 Prolog 编写四个约束条件。membersublist 可能是有用的谓词。
有没有什么方法可以在 Prolog 下编写它?谢谢。
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).

为什么不检查每个房子都有它自己的颜色等呢? - anton0xf

2

我是Prolog的新手,但我认为neigh的定义不太对。请尝试以下方式:

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

你的代码只能找到一个解决方案,但实际上有两个解决方案。一个是在第二个房子里有日本人拥有的斑马,另一个是在第三个房子里有斑马。尽管如此,你的代码已经足够回答问题了。以下代码可以正确回答问题,并给出两个解决方案:
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).

你是对的,在另一个答案中那个定义有错误/打字错误。你给出了三个房子的情况下有效的定义,但这就是我们现在所拥有的,所以没问题。另一个答案的定义仅适用于三个房子的情况。 - Will Ness

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接