簡體   English   中英

定義一個列表作為規則,然后在Prolog中獲取第一個元素

[英]defining a list as a rule and then getting the first element in 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陌生,因此很有可能我在所有語法上都做錯了,但能幫助我找出解決方法的好極了

將參數放置在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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM