- •Якимов с.П. Логическое программирование.
- •Красноярск
- •03.04.06 Г., протокол № 9
- •Содержание
- •Введение
- •1 Введение в логическое программирование
- •2 Основные конструкции логического программирования
- •3 Структура программы на языке Пролог
- •4 Вычислительная модель логических программ
- •5 Управление выполнением программы на языке Пролог
- •5.2Caf– метод (CutAndFail– отсечение и отказ)
- •6 Рекурсивные структуры данных
- •7 Программирование баз данных
- •7.1 Управление встроенной базой данных
- •7.2 Управление внешней базой данных
- •8.1 Основные конструкции логического программирования. Факты и правила(2 часа)
- •Контрольные вопросы
- •8.2 Вычислительная модель логических программ. Логические схемы(4 часа)
- •Контрольные вопросы
- •8.3 Управление выполнением программы на языке Пролог. Оконный интерфейс (4 часа)
- •Контрольные вопросы
- •8.4 Рекурсивные структуры данных. Списки (4 часа)
- •Контрольные вопросы
- •8.5 Программирование баз данных. Базы данных (4 часа)
- •Контрольные вопросы
- •Библиографический список
- •Приложение а Ключевые слова
6 Рекурсивные структуры данных
Пролог допускает несколько эквивалентных способов записи списков, соотношение между которыми пояснено таблицей 1. Первая колонка представляет запись списков с помощью функтора «•». Вторая– эквивалентную запись с помощью квадратных скобок. Третья– содержит выражение, являющееся упрощением второй колонки, в котором рекурсивная структура списка оказывается скрытой. В такой записи список представляется в виде последовательности элементов, ограниченной квадратными скобками и разделяемыми запятыми. В качестве элементов в списках приводятся некоторые условные константыa,b,c.
Формальный объект, записанный с использованием функтора «•» |
Формальный объект, записанный с использованием квадратных скобок |
Запись с помощью элементов |
•(a, [ ]) |
[a│[ ]] |
[a] |
•(a, •(b, [ ])) |
[a│[b│[ ]]] |
[a, b] |
•(a, •(b, •(c, [ ]))) |
[a│[b│[c│[ ]]]] |
[a, b, c] |
•(a, X) |
[a│X] |
[a│X] |
•(a, •(b, X)) |
[a│[b│X]] |
[a, b│X] |
Поскольку списки являются более богатой структурой данных, чем обычные константы, с ними связан набор полезных отношений. Фундаментальной операцией является определение вхождения отдельного элемента в список:
Протокол поиска ответа на вопрос
?– member(5, [4, 2, 5, 7]).
member(5, [4, 2, 5, 7]) member(5, [2, 5, 7]) member(5, [5, 7]) Yes Yes Yes |
|
Дополним правило memberнесколькими фактами:
list([1, 3, 5, 7, 9]).
list([2, 4, 6, 8, 10]).
и продемонстрируем, каким образом можно использовать списки на примере конъюнктивного вопроса:
?– list(X), member(8, X).
X= [2, 4, 6, 8, 10]
Yes
Следующий предикат– сложение списков:
Возможные обращения и варианты ответов:
?– concat_lists([1, 5, 3 ], [2, 4, 7], L).
concat_lists([1, 5, 3], [2, 4, 7], L) concat_lists([5, 3], [2, 4, 7], Z1) concat_lists([3], [2, 4, 7], Z2) concat_lists([ ], [2, 4, 7], Z3) Yes Yes Yes Yes |
L= [1│Z1] Z1= [5│Z2] Z2= [3│Z3] Z3= [2, 4 ,7] Z2= [3, 2, 4 ,7] Z1= [5, 3, 2, 4 ,7] L= [1, 5, 3, 2, 4 ,7] |
После выхода из рекурсии будет получен ответ L= [1, 5, 3, 2, 4 ,7].
?– concat_lists([1, 5, 3 ], L, [1, 5, 3, 8, 3]).
concat_lists([1, 5, 3], L, [1, 5, 3, 8, 3]) concat_lists([5, 3], L, [5, 3, 8, 3]) concat_lists([3], L, [3, 8, 3]) concat_lists([ ], L, [8, 3]) Yes Yes Yes Yes |
L= [8, 3]
|
Контрольные вопросы
Дайте определение списка.
Какие способы задания списков вы знаете?
Из чего состоит рекурсивное правило?
Какая рекурсия называется левосторонней, а какая правосторонней?
7 Программирование баз данных
7.1 Управление встроенной базой данных
(HANDLING THE INTERNAL DATABASE)
consult(D) |
(string) |
| |
(i) - |
считывает предикаты из текстового файла Dи помещает их во встроенную базу данных. | ||
consult(D, BD) |
(string, InternalDatabaseName) |
| |
(i,i) - |
считывает предикаты из текстового файла Dи помещает их в именованную базу данныхBD. | ||
save(D) |
(string) |
| |
(i) - |
дописывает предикаты, содержащиеся во астроенной базе данных в текстовый файл D. | ||
save(D, BD) |
(string, DatabaseName) |
| |
(i,i) - |
дописывает предикаты, содержащиеся в именованной базе данных BDв текстовый файлD. | ||
assert(T) |
(InternalDatabaseDomain) |
| |
(i) - |
помещает факт Tв текущую точку встроенной базы данных. | ||
asserta(T) |
(InternalDatabaseDomain) |
| |
(i) - |
помещает факт Tв начало встроенной базы данных. | ||
assertz(T) |
(InternalDatabaseDomain) |
| |
(i) - |
помещает факт Tв конец встроенной базы данных. | ||
nondeterm retract(T) |
(InternalDatabaseDomain) |
| |
( _ ) - |
предикат заканчивается успехом, если удается удалить из встроенной базы данных первый факт, удовлетворяющий шаблону T. | ||
nondeterm retract(T, DB) |
(InternalDatabaseDomain) |
| |
( _, i) - |
предикат заканчивается успехом, если удается удалить из именованной базы данных DBпервый факт, удовлетворяющий шаблонуT. | ||
retractall(T) |
(InternalDatabaseDomain) |
| |
( _ ) - |
удаляет из встроенной базы данных все факты, удовлетворяющие шаблону T, успешен всегда. | ||
retractall(T, DB ) |
( _, InternalDatabaseDomain) |
| |
( _, i) - |
удаляет из именованной базы данных DBвсе факты, удовлетворяющие шаблонуT, успешен всегда. |