【问题标题】:Not member rule doesn't work as expected in Prolog非成员规则在 Prolog 中无法按预期工作
【发布时间】: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


【解决方案1】:

您定义了changecolour,但从未使用过它;你使用了nextcolour,但从未定义它。

【讨论】:

  • 当我在堆栈溢出中输入查询时出现错误。在程序中是正确的。
  • @m.lewis1995 如果您将实际代码复制/粘贴到您遇到问题的问题中,将会有很大帮助。
  • @m.lewis1995 不一定是所有的代码,但至少你放在那里的应该是准确的。
猜你喜欢
  • 1970-01-01
  • 2017-12-24
  • 2018-08-12
  • 1970-01-01
  • 2015-08-25
  • 2013-07-24
  • 2013-08-11
  • 2019-03-15
相关资源
最近更新 更多