首页 文章

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

提问于
浏览
-1

如果不是很熟悉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 回答

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

相关问题