我正在阅读“现在学习Prolog”,其中一项我无法解决的练习如下:
有三条街 邻近的房子都有一个 不同的颜色。它们是红色,蓝色, 和绿色。不同的人 民族生活在不同的地方 房子和他们都有不同的 宠物。这里有一些更多的事实 它们:
- 英国人住在红房子里。
- 美洲虎是西班牙家庭的宠物。
- 日本人住在蜗牛门的右边。
- 蜗牛守护者住在蓝屋的左边。
谁养斑马?
定义一个谓词
zebra/1
,告诉您斑马主人的国籍。提示:想想房屋和街道的代表。编写Prolog中的四个约束。
member
和sublist
可能是有用的谓词。
如何在Prolog下编写代码?感谢。
答案 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).