我正在尝试在Prolog中找到列表的第n个元素。这是我尝试使用的代码:
Cells = [OK, _, _, _, _, _] ....next_safe(_) :-facing(CurrentDirection),delta(CurrentDirection, Delta), in_cell(OldLoc), NewLoc is OldLoc + Delta,nth1(NewLoc, Cells, SafetyIdentifier),SafetyIdentifier = OK .
基本上,我试图检查给定的单元格是否“OK”可以移动到其中。我遗漏了什么吗?
回答:
@人名,我不太清楚你想要用这段代码做什么,但有一些评论可能会有所帮助。
在Prolog中,以大写字母开头的内容是要在规则中匹配的变量。 _
是一个特殊的符号,可以用来代替变量名,表示任何值都可以匹配。
因此,如果您给 next_safe(_)
一个特定的值,它只能为您提供一个true/false的答案。Prolog的主要优点之一是通过回溯与变量统一(正如@人名所说)。这意味着,如果正确编写,您只需询问Prolog next_safe(X).
,它就会返回所有可能的与X统一的值(安全移动)。
回到关于大写字母的第一点。这意味着 OK
实际上是一个等待匹配的变量。它实际上是一个空盒子,你试图与另一个空盒子匹配。我认为你想要使用的是值 ok
,这是不同的。您不能以与其他编程风格相同的方式分配变量。以下内容可能更接近您正在寻找的内容,但我仍然不确定它是否正确,因为它看起来你正在尝试分配一些东西,但我不确定你的 nth1
是如何工作的。
Cells = [ok, _, _, _, _, _] ....next_safe(NewLoc) :- facing(CurrentDirection), delta(CurrentDirection, Delta), in_cell(OldLoc), NewLoc is OldLoc + Delta, nth1(NewLoc, Cells, ok).