[英]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.