Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
83
Добавлен:
04.01.2020
Размер:
408.06 Кб
Скачать
  1. Структура данных - списки. Построение дерева поиска решений логической программы.

Список - последовательность произвольного числа элементов. В логическом программировании список обозначается [].

Структуры данных в логическом программировании записываются как функторы:

f(x1,x2,…,xn),

где f - имя функтора, xi - элементы данных для i от 1 до n.

Список - это бинарная рекурсивная структура данных. Первый компонент структуры - это элемент, второй - остаток списка, таким образом, необходим функтор арности 2. В логическом программировании принято функтор для списков обозначать точкой " · ". При построении списков необходимo наличие константного символа, чтобы рекурсия не была бесконечной. Таким символом является "пустой список", который в Прологе обозначается [].

Чтобы не перегружать программу обращением к символу " · ", используется специальная запись: терм · (Х,У) обозначается как [X|Y]. Ком­поненты терма имеют специальные названия: X - голова списка, Y - хвост списка.

Общепринятая запись вышеперечисленных списков:

[a| [ ] ] – или [ а ];

[ а | [ b | [ c | [ ] ] ] ] – или [a, b, c];

[ а | X ];

[ а | [ b | X] ] – или [ а , b | X ].

Основные предикаты обработки списков, которые могут использоваться при написании более сложных программ:

- принадлежность списку;

- объединение двух списков;

- выделение элемента из списка;

- удаление всех вхождении элемента из списка;

- сортировка элементов списка;

- определение длины списка и др.

Список - частный случай двоичного дерева.

Списки используют для представления множеств, но в списке имеет значение порядок элементов, кроме того один и тот же объект может встретиться в списке несколько раз.

Корень дерева - цель G. Каждая вершина дерева имеет несколько ребер, каждое из которых соответствует одному применению правила резолюции.

Вершины дерева могут быть конъюнктивными (конъюнкция целей), причем одна из подцелей подчеркивается. Подчеркивается та цель, которая применяется в правиле резолюции.

Рядом с ребрами подписывается результат унификации, т. к. резолюция происходит лишь в результате успешной унификации.

Вершина имеет столько ребер, сколько происходит унификация с правилами программы.

В каждой вершине находится резольвента. По дереву поиска хорошо видно сколько может быть возможных решений.

Нарисовать дерево поиска решений append([a,b],[c,d],[a,b,c,d])

append([a,b],[c,d],[a,b,c,d])

X=a, XS=[b],YS=[c,d],ZS=[b,c,d]

append([b],[c,d],[b,c,d])

X=b, XS=[],YS=[c,d],ZS=[c,d]

append([],[c,d],[c,d])

true