我试图在Prolog中找到List的第n个元素。这是我试图使用的代码:
Cells = [OK, _, _, _, _, _] .
...
next_safe(_) :-
facing(CurrentDirection),
delta(CurrentDirection, Delta),
in_cell(OldLoc),
NewLoc is OldLoc + Delta,
nth1(NewLoc, Cells, SafetyIdentifier),
SafetyIdentifier = OK .
基本上,我试图检查一个给定的单元格是否“OK”进入。我错过了什么吗?
答案 0 :(得分:5)
有一个名为nth0的预定义谓词。
5 ?- nth0(1,[1,2,3],X).
X = 2.
6 ?- listing(nth0).
lists:nth0(A, B, C) :-
integer(A), !,
A>=0,
nth0_det(A, B, C).
lists:nth0(A, B, C) :-
var(A), !,
nth_gen(B, C, 0, A).
true.
索引列表从0开始 希望这会有所帮助..
答案 1 :(得分:2)
以Prolog中的大写字母开头的事情是要在规则中匹配的变量。 _
是一个特殊符号,可用于代替变量名称,以指示任何值都可以匹配。
next_safe(_)
只能为您提供真/假答案。 Prolog的一个主要好处是能够通过回溯来统一变量(正如ony所说)。这意味着当正确编写时,您可以只询问Prolog next_safe(X).
,它将返回与X统一的所有可能值(安全移动)。
回到关于大写字母的第一点。这意味着OK
实际上是一个等待匹配的变量。它实际上是一个空盒子,你试图匹配另一个空盒子。我认为你想要的是使用不同的值ok
。您不会以与在其他编程样式中相同的方式分配变量。像下面这样的东西可能更接近你正在寻找的东西,虽然我仍然不确定它是正确的,因为它看起来你正在尝试分配东西,但我不确定你的nth1
是如何工作的。 / p>
Cells = [ok, _, _, _, _, _] .
...
next_safe(NewLoc) :-
facing(CurrentDirection),
delta(CurrentDirection, Delta),
in_cell(OldLoc),
NewLoc is OldLoc + Delta,
nth1(NewLoc, Cells, ok).