【发布时间】:2016-04-26 13:30:21
【问题描述】:
我正在尝试在 Prolog 中创建一个迷宫程序,其目的是找到一条从迷宫起点到迷宫中心点 m 的路线。迷宫由使用四种颜色之一连接的正方形组成:蓝色、绿色、紫色或橙色。从起点到中心的路线遵循四种颜色的重复模式。
我创建了以下代码:
link2(A, Colour, B) :- link(A, Colour, B).
link2(A, Colour, B) :- link(B, Colour, A).
changecolour(blue,green).
changecolour(green,purple).
changecolour(purple,orange).
changecolour(orange,blue).
route(A, Colour1, B, List2) :-
link2(A, Colour1, B),
append([A], [B], List2).
route(A, Colour1, B, List2) :-
link2(A, Colour1, X),
changecolour(Colour1,Colour2),
append([A], List, List2),
\+ member(A, List),
route(X, Colour2, B, List).
由于某种原因,代码没有按预期工作,我不确定为什么。我觉得这与否定(不是成员)规则有关,但有人可以告诉我我做错了什么吗?
【问题讨论】:
-
它在做什么,你期待什么?
-
使用
maplist(dif(A), Ls)以纯逻辑方式表示A不在列表Ls中。 -
我的目标是让 prolog 打印出从 start 到 m 的路线,但是,当我运行跟踪时,Prolog 会询问 start 是否只是一个变量列表的成员,_G449所以返回 > Exit: (8) lists:member(start, [start|_G452]) ?蠕变。退出意味着成功,但是由于在这种情况下我们有“非成员”,所以退出成员成功意味着在这里失败。只有当程序返回到已经访问过的方格时,“非成员”才会失败。
-
不,您应该将
\+ member(A, List)替换为maplist(dif(A), List)。 -
@lurker 关于 SO by mat 的答案肯定有很多,假的,重复使用这个成语。
标签: list prolog logic negation prolog-dif