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

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