Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Логическое программирование. Turbo Prolog 2.0.doc
Скачиваний:
72
Добавлен:
04.06.2015
Размер:
1.59 Mб
Скачать

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]

Контрольные вопросы

  1. Дайте определение списка.

  2. Какие способы задания списков вы знаете?

  3. Из чего состоит рекурсивное правило?

  4. Какая рекурсия называется левосторонней, а какая правосторонней?

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, успешен всегда.