将列表定义为规则,然后获取Prolog中的第一个元素

时间:2016-04-23 20:11:11

标签: list prolog

如果对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很新,所以我很有可能把所有的语法都搞错了,但帮助我找到一种方法可能会很棒

1 个答案:

答案 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,它对列表的每个元素执行某些操作。