如果对Prolog不是很熟悉,但我们正在使用编程语言作为另一种开发的非常未知的编程语言。我的问题如下。我很清楚我可以在Prolog查询中写一下
([Head|Tail]) = ([a,b,c]).
这将导致我
Head = a, Tail = b,c.
但是,这不是我需要的。 我正在写一个机器人,从程序中接收一个列表。该列表基本上是机器人必须走过的东西,并在程序中找到列表的每个元素,称之为环境。现在我的问题如下:
我似乎无法为如何获取该列表的第一个元素定义一些规则。我一直在尝试各种各样的事情。首先是声明:
parameterList([a,b,c,d].
nextElement(X) :- parameterList(Z), member(Z,X).
似乎不起作用。为什么这不起作用?因为我也无法弄明白,所以我会事先提出下一个问题。从环境中我得到一个参数indexOfNextElement(B)。这将返回我需要检索的列表中哪个元素的值。当然它从0开始,一旦这个由机器人交付,索引就会上升(这会自动进行)。
我再一次对Prolog很新,所以我很有可能把所有的语法都搞错了,但帮助我找到一种方法可能会很棒
答案 0 :(得分:3)
将参数放在member / 2 [a,b,c,d]
中的方式是列表Z
中的成员。因此,在查询时,您将获得由列表替换的变量X
:
?- nextElement(X).
X = [[a,b,c,d]|_A] ? ;
X = [_A,[a,b,c,d]|_B] ? ;
...
如果你翻转参数:
nextelement(X) :-
parameterList(Z),
member(X,Z).
结果就是我想你想要的:
?- nextelement(X).
X = a ? ;
X = b ? ;
X = c ? ;
X = d ? ;
no
至于将元素放在第n个位置:这基本上是索引列表与该索引元素之间的关系:
:- use_module(library(clpfd)).
list_nth_element(L,N,E) :-
list_nth_element_(L,N,E,0). % the first index is 0
list_nth_element_([H|_T],N,H,N). % element at index N
list_nth_element_([_H|T],N,E,Pos0) :-
N #> Pos0, % position differs from index
Pos1 #= Pos0 + 1,
list_nth_element_(T,N,E,Pos1). % E must be in the tail
您可以通过不同方式查询。哪些元素在哪些指数?:
?- list_nth_element([a,b,c,d],N,E).
E = a,
N = 0 ? ;
E = b,
N = 1 ? ;
E = c,
N = 2 ? ;
E = d,
N = 3 ? ;
no
哪个元素位于索引1?:
?- list_nth_element([a,b,c,d],1,E).
E = b ? ;
no
在哪个位置是元素c
?:
?- list_nth_element([a,b,c,d],N,c).
N = 2 ? ;
no
通常,如果您想对列表中的所有元素执行某些操作,则可以遵循以下模式:
predicatename([],...).
predicatename([H|T], ...) :-
% do something with H here
predicatename(T,...).
请注意规则标题中的...
和递归目标。这是您放置关系的其他参数的位置(请参阅上面的list_nth_Element / 3)。根据您要查询的内容,将依据参数保留为变量,Prolog将使用解决方案替换该变量,一次一个(参见上面的示例查询)。
关于您的评论:以上查询只是您可以使用list_nth_element / 3的一些示例。当然,您也可以将它用作机器人谓词中的目标:
robotpredicatename(...) :-
...
% you get the list somewhere here
...
list_nth_element(L,N,E),
...
在目标list_nth_element / 3之前的某个地方,您的谓词会获得感兴趣的列表并将其绑定到变量,例如L
。列表可用后,您可以使用list_nth_element / 3和L
将元素放在所需位置。或者您可以使用上面的模式编写谓词而不是list_nth_element / 3,它对列表的每个元素执行某些操作。