Объединение списков

append(list, list, list).

append([], L, L).

append([H|T], L, [H|T1]):- append(T, L, T1).

Предикат append принадлежит к классу предикатов, аргументы которых могут быть инвертированы по смыслу.

append([1,2,3], [4,5], X) X=[1,2,3, 4,5]

append(1,2,3], X, [1,2,3,4,5]) X=[ 4,5]

append(X, [4,5], [1,2,3, 4,5]) X=[1,2,3]

Для целевого утверждения append(X, Y, [1,2,3]) получим следующие решения

X1=[] Y1=[1,2,3]

X2=[1] Y2=[2,3]

X3=[1,2,3] Y3=[]

Легко видеть, что разные решения получаем в зависимости от того, с какими значениями аргументов происходит сопоставление целевого утверждения и граничного условия.

При рекурсивной обработке списков граничные условия могут быть расположены в предикатной группе как на первом, так и на последнем месте. Существует один случай, когда граничные условия обязательно должны быть последним предикатом – это задача формирования списка

get_list ([H|T]):- write (“input element”), readint (H), H<>666, get_list(T).

get_list ([]).

Если бы предельное условие было на первом месте, то при обращении к этому правилу get_list(X) мы бы получили X=[ ], так как при обращении к рекурсивной части правила была бы попытка разбить пустой список на хвост и голову.

Определение всех решений вместе. При работе с недетерминированными предикатами довольно часто возникает необходимость иметь все решения одновременно. Очевидно, что наиболее удобной структурой для их размещения будет список. Для этой цели существует стандартный предикат findall(предикат, переменная, список).

Например, пусть имеем задачу, в которой необходимо вычислить среднюю годовую прибыль группы людей, информация о прибыли каждого из которых записана в форме предиката worker(name, sum). Тогда эта задача будет сформулирована в виде следующего правила

middl_sum(Y):-findall(worker(_,X), X, List), len(List, N), sum(List, S),Y=S/N.

Правила для вычисления количества элементов списка и их суммы были рассмотрены выше.

ЛЕКЦИЯ 5


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: