23

プロローグでリストの特定のメンバーにアクセスする方法を教えてもらえますか? たとえば、ルールに渡されたリストの 3 番目または 4 番目の要素にアクセスする必要があるとします。

4

4 に答える 4

31

nth0(Ind, Lst, Elem)またはnth1(Ind, Lst, Elem)SWI-Prolog ではnth0、最初の要素のインデックスは 0 です。

例えば、

nth0(3, [a, b, c, d, e], Elem). %Binds d to Elem
nth1(3, [a, b, c, d, e], Elem). %Binds c to Elem

nth0(Ind, [a, b, c, d, e], d).  %Binds 3 to Ind
nth0(3, [a, b, c, X, e], d).    %Binds d to X

nth0(3, [a, b, c, d, e], c).    %Fails.
于 2012-10-17T17:06:47.410 に答える
6

アクセスする必要があるインデックスが非常に小さい場合は、パターン マッチングを使用できます。3 番目または 4 番目の要素が必要だとします。

third([_,_,E|_], E).
fourth([_,_,_,E|_], E).

これは、リストが位置関連の情報を運ぶ場合に「インライン」で使用すると、より便利になる可能性があります。例えば

your_rule([_,_,E|Rest], Accum, Result) :-
   Sum is Accum + E,
   your_rule(Rest, Sum, Result).
...
于 2012-10-17T20:44:19.250 に答える
1

プロローグ リストは古典的なリストです。アクセスは直接ではありません。必要なものを見つけるには、繰り返し処理する必要があります。

この方法で n 番目の要素を取得できます。

foo( [X1,X2,X3,X4,...,XN|Xs] ) :- ...

ここで、[code]X[/code] nはリストのn 番目の要素です。nが小さい値よりも大きい場合は実用的ではありません。これは、C/C++ ポインター式にほぼ類似しています。

LLNode *nthElement = root->next->...->next ;

それ以外の場合は、次のような組み込みの述語または自作の述語を使用して、リストを反復処理して目的の要素を見つける必要があります。

foo(Xs) :- nth_element(Xs,9,X) , ...

nth_element(Xs,N,X) :- nth_element(Xs,0,N,X) .

nth_element([X|Xs],N,N,X) :- !. nth_element([_|Xs],T,N,X) :- T1 は T+1 、nth_element(Xs,T1,N,X) です。

于 2012-10-17T17:30:42.137 に答える
0

SWI-Prologのライブラリを使用するfuncと、リスト内包表記をより簡潔に記述できます。

:- use_module(library(func)).

nth0((Index, List), Result) :-
    nth0(Index,List,Result).

これで、リストの 2 つの要素にアクセスして、次のように追加できます。

example :-
    List = [1,5,12,9],
    Y is (nth0 $ (0, List)) + (nth0 $(3,List)), %add the 1st and 4th elements of this list
    writeln(Y). %prints 10
于 2016-09-15T05:51:34.810 に答える