Пролог, доступ к конкретному члену списка?
Может кто-нибудь сказать мне, как получить доступ к конкретному члену списка в прологе? Скажем, например, мне нужен доступ к 3-му или 4-му элементу списка, переданного в правило?
4 ответа
nth0(Ind, Lst, Elem)
или же nth1(Ind, Lst, Elem)
с SWI-прологом, 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.
Когда индексы, к которым вам нужно получить доступ, настолько малы, вы можете использовать сопоставление с образцом. Скажем, нам нужен третий элемент или четвертый:
third([_,_,E|_], E).
fourth([_,_,_,E|_], E).
Это может быть более полезным, если используется "встроенный", когда список содержит информацию с позиционной релевантностью. Например
your_rule([_,_,E|Rest], Accum, Result) :-
Sum is Accum + E,
your_rule(Rest, Sum, Result).
...
Пролог - это классический список. Доступ не прямой. Вы должны перебрать, чтобы найти то, что вам нужно.
Вы можете получить 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).
С использованием 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