Рекурсивные
структуры данных Списки. Список - это один из самых простых и
полезных типов структур, широко используемых в нечисловом программировании.
Список - это последовательность, составленная из произвольного числа элементов
одного типа. ["a", "b", "c", "d", "e"] ["a",
"b", "c", | T]
[T] - список
из 1-го элемента. [_| T] - список как минимум из одного элемента.
Списки можно применять для представления множеств, хотя между ними есть отличия: 1.
порядок элементов в списке существенен 2. элементы списка могут сколько угодно
раз повторяться Однако наиболее часто используемые операции
над списками - аналогичная операция над множествами. Среди них: проверка
принадлежности элемента списку конкатенация добавление нового, или удаление
элемента списка Рекурсивные процедуры служат наиболее
удобным средством для выполнения действий с каждым элементом списка. Поскольку
они освобождают программиста от необходимости заранее знать точную длину обрабатываемого
списка. Пример рекурсивной процедуры поиска слова в списке слов. найти_слово(Слово,
[]):-write(Слово), write("Не найдено слово"), nl, !. найти_слово(Слово,
[Слово|_]):- !. найти_слово(Слово, [_|T]):- найти_слово(Слово, T). Goal:
найти_слово("утро", ["вечер", "день", "утро"]) yes Goal:
найти_слово(X, ["вечер", "день", "утро"]) X=вечер Х=день Х=утро Х=[] 4
Solutions Это без отсечения, а если с отсечением то Х=вечер найти_номер([H|T],
1, H). найти_номер([H|T], N, X):- найти_номер(T, M, X), N=M+1. Goal:
найти_номер(["a", "b", "c", "d"], X, "c") X=3
Здесь появится сообщение "нажмите F10" потому что T явно не используется
в первом правиле, как этого избежать? найти_номер([H|_], 1, H). найти_номер([_|T],
N, X):- найти_номер(T, M, X), N=M+1. Построение списков
из фактов - findall/ служащий(имя, фамилия, должность, оклад) сумма([],
0). Сумма([X, R], итог):- сумма(R, сумма), Итог=Х + сумма. Goal:
findall(Оклад, служащий(_, _, _, Оклад), Список), Сумма(Список, Итог). Findall(Переменная,
Атом, Список). Иногда бывает полезно представлять в виде списка информацию,
содержащуюся в известных фактах. В Прологе для этой цели служит предикат findall,
здесь Атом - это отношение, которое определяет список элементов, конкретизирующих
переменную в качестве аргумента предиката атом. Выше описан пример поиска общей
суммы окладов служащих, записанных в БД. Ввод элементов
с клавиатуры. ввод(Y):-write("Введите элемент"), nl, readln(C), ввод(С,
Y). ввод(".", []):-!. ввод(C, [C|Y]):-readln(C1), ввод(C1, Y). Goal:
ввод(X) [ a | y ] [ a | [ b | y ] ] [ a | [ b | [ c | y ] ] ] [
a | [ b | [ c | [ d | y ] ] ] ] Бинарные
деревья 
Это двоичный рекурсивный тип данных, который определяет как имеющий левое поддерево,
корень и правое поддерево.
дерево(3, дерево(1,
nil, nil), дерево(2, nil, nil))
дерево(d, дерево(c, дерево(a,
nil, nil)), дерево(b, nil, nil)), дерево(f, nil, nil)).
Программа позволяющая определить бинарное дерево из элементов множества, вводимых
с клавиатуры. domains x = integer y = tree(x, y,
y); nil predicates бин_дерево(у) clauses бин_дерево(tree(X, L, R)):-readint(X),
X<>0, бин_дерево(L), бин_дерево(R), !. бин_дерево(nil):-!. Goal:
бин_дерево(Х).
 Поиск
элемента в упорядоченном дереве. Упорядоченным деревом называется дерево,
в котором элемент правого поддерева больше корня, а элемент левого поддерева меньше
корня.
прин_дереву(X, дерево(X, L, R)):-!. прин_дереву(X,
дерево(Y, L, R)):-X>Y, прин_дереву(X, R),!. прин_дереву(X, дерево(Y, L,
_)):-прин_дереву(X, L). Способы
представления БД в Пролог программах. В Прологе существует 5 основных
способов представления БД: 1. Множество фактов, каждое из которых соответствует
целостному информационному элементу. 2. Множество фактов, представленных в
виде совокупности значений, атрибут. 3. Список структур, каждый элемент в котором
соответствует целостному информационному элементу. 4. Линейная рекурсивная
структура. 5. Рекурсивная структура в виде двоичного дерева.
БД
о семьях: 1. семья(фам, имя_папы, имя_мамы, реб1, реб2, реб3) 2. папа_дети(фам,
имя_папы, реб1, реб2, реб3) мама_дети(фам, имя_мамы, реб1, реб2, реб3)
семья(Х):-папа_дети(Х, _, N1, N2, N3), мама_дети(Х, _, N1, N2, N3). |