Prolog:在列表中查找第N个元素

时间:2010-04-06 04:09:13

标签: artificial-intelligence prolog

我试图在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”进入。我错过了什么吗?

2 个答案:

答案 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).