在 Prolog 中解决逻辑难题 [关闭]

Posted

技术标签:

【中文标题】在 Prolog 中解决逻辑难题 [关闭]【英文标题】:Solving logic puzzle in Prolog [closed] 【发布时间】:2011-06-10 14:47:37 【问题描述】:

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

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

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

斑马是谁养的?

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

提示:想想房屋和街道的表示。在 Prolog 中对四个约束进行编码。 membersublist 可能是有用的谓词。

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

【问题讨论】:

【参考方案1】:
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).

【讨论】:

【参考方案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).

【讨论】:

你是对的,在另一个答案的定义中存在错误/错字。你对三所房子的情况给出了一个有效的定义,但这就是我们这里的定义,所以没关系。另一个答案的定义也仅适用于三个房屋的情况。

以上是关于在 Prolog 中解决逻辑难题 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

.NET 的逻辑变量支持 [关闭]

Prolog 逻辑谜题和约束编程

在 Prolog 中使用约束和排列解决难题

在 Prolog 中解决关于时间限制的难题

在 CLPQ/R (Prolog) 中解决一个简单的几何难题

在 Prolog 中解决“Feed the Golorp”难题