在 Prolog 中解决逻辑难题 [关闭]
Posted
技术标签:
【中文标题】在 Prolog 中解决逻辑难题 [关闭]【英文标题】:Solving logic puzzle in Prolog [closed] 【发布时间】:2011-06-10 14:47:37 【问题描述】:我正在阅读“立即学习 Prolog”,其中一个我自己无法解决的练习如下:
有一条街有三个 相邻的房子都有 不同的颜色。它们是红色的,蓝色的, 和绿色。不同的人 不同的民族生活在不同的地方 房子,他们都有不同的 宠物。这里有更多关于 他们:
英国人住在红房子里。 美洲虎是西班牙家庭的宠物。 日本人住在蜗牛饲养员的右边。 蜗牛饲养员住在蓝房子的左边。斑马是谁养的?
定义一个谓词
zebra/1
,告诉您斑马主人的国籍。提示:想想房屋和街道的表示。在 Prolog 中对四个约束进行编码。
member
和sublist
可能是有用的谓词。
任何想法如何在 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 中解决逻辑难题 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章