あなたが配置されている方法でそれを行う方法を見つけ出す手助けするために驚くべきだろうメンバー/ 2内の引数[a,b,c,d]
はリストZ
のメンバーです。あなたは引数を反転した場合
?- nextElement(X).
X = [[a,b,c,d]|_A] ? ;
X = [_A,[a,b,c,d]|_B] ? ;
...
:それを照会する場合したがって、あなたはリストで置換変数X
を取得
nextelement(X) :-
parameterList(Z),
member(X,Z).
結果は私がしたいと思うものです:
?- nextelement(X).
X = a ? ;
X = b ? ;
X = c ? ;
X = d ? ;
no
として、これは、基本的に、リストとインデックスとの間の関係です。
:- 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
要素c
あるインデックスで1?:
?- list_nth_element([a,b,c,d],1,E).
E = b ? ;
no
された位置で、どの要素:?
一般に
?- 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はその変数を一度に1つずつリレーションに置き換えます(上記のクエリの例を参照)。
あなたのコメントについて:上記の質問は、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の代わりに述語を書くことができます。これはリストの各要素で何かを行います。
'member(X、Z) 'にする必要があります。 –
'([Head | Tail])=([a、b、c])。 'では、かっこは余分です。あなたは '' [Head | Tail] = [a、b、c] 'と書くことができます。あなたのコメントは次のように書かれています:*リストの最初の要素を取得する方法についていくつかのルールを定義できないようです* *。*しかし、それ以前のあなたの例のクエリはまさにそれを行います。リストが 'L'の場合、' L = [First | Rest] 'は' First'が 'L'の最初の要素になり、' Rest'がリストの残りの部分になります。あなたのその後の質問では、*環境から私はパラメータ 'indexOfNextElement(B)' *を得ると言います。 「環境から」という言葉が何を意味するのかは不明です。 – lurker