Пролог, доступ к определенному члену списка?

Может ли кто-нибудь сказать мне, как получить доступ к определенному члену списка в прологе? Скажем, например, мне нужно получить доступ к третьему или четвертому элементу списка, переданного в правило?

Ответы

Ответ 1

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.

Ответ 2

Когда индексы, к которым вам нужен доступ, настолько малы, вы можете использовать сопоставление шаблонов. Скажем, нам нужен третий или четвертый элемент:

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

Это может быть более полезно, если используется "inline", когда список содержит информацию с позиционной релевантностью. Например,

your_rule([_,_,E|Rest], Accum, Result) :-
   Sum is Accum + E,
   your_rule(Rest, Sum, Result).
...

Ответ 3

Список пролога - классический список. Доступ не является прямым. Вам нужно перебирать, чтобы найти то, что вам нужно.

Вы можете получить n-й элемент таким образом:

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

где [код] X [/code] n является n-ым элементом списка. Непрактично для n больше небольшого значения. Это примерно аналогично выражению оператора C/С++:

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

В противном случае вам нужно перебрать список, чтобы найти нужный элемент, используя встроенный предикат или предикат home- brew, что-то вроде:

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).

Ответ 4

Используя библиотеку func для SWI-Prolog, можно более подробно описать список понятий:

:- use_module(library(func)).

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

Теперь вы можете получить доступ к двум элементам списка и добавить их вместе следующим образом:

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