Пролог, доступ к определенному члену списка?
Может ли кто-нибудь сказать мне, как получить доступ к определенному члену списка в прологе? Скажем, например, мне нужно получить доступ к третьему или четвертому элементу списка, переданного в правило?
Ответы
Ответ 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