- •Глава 2 арифметика и структуры данных
- •2. 1. Арифметика
- •Арифметические выражения
- •Предикат "is"
- •Предикаты, выполняющие сравнение
- •Виды связи аргументов
- •2. 2. Структуры данных Типы термов
- •Примеры составных термов
- •Рекурсивные структуры
- •Процедура, которая строит рекурсивную структуру
- •2. 3. Списки Представление списков при помощи структуры "./2"
- •Другая форма представления списка, в которой употребляются квадратные скобки
- •Представление списков произвольной длины
- •Список произвольной длины при использовании формы записи с квадратными скобками
- •Унификация списков
- •Сравнение списков и простых структур
- •2. 4. Процедуры, выполняющие действия со списками Применение рекурсивных процедур для обработки списков
- •Выполнение запроса к процедуре "печатать—элементы"
- •Печать списка в обратном порядке
- •Форма записи аргументов в заголовке правила
- •Примеры процедур, предназначенных для обработки списков
- •2. 5. Способы представления базы данных Пять способов представления
- •1) Представление целостных информационных элементов в виде фактов
- •2) Представление атрибутов в виде фактов
- •3) Представление в виде списка структур
- •4) Представление в виде рекурсивной структуры
- •5) Представление в виде двоичного дерева
- •Сравнение разных видов представления базы данных
- •Библиографические заметки
- •Упражнения
Процедура, которая строит рекурсивную структуру
Рекурсивные структуры могут использоваться для описания различных видов сложных взаимосвязей между термами. Примером этого может служить рекурсивная процедура "можно_путешествовать5", во многом похожая на процедуру "можно_путешествовать4". В процедуре "можно_путешествовать5" строится рекурсивная структура "путь/3", описывающая все промежуточные пункты, посещаемые по пути из исходного города в пункт назначения.
% компания отправление прибытие вид транспорта
путешествие (амтрак, нью_йорк, бостон, поезд).
путешествие (ндж_транзит, нью_йорк, принстон, поезд).
путешествие (амтрак, бостон, портленд, поезд).
путешествие (грейхаунд, бостон, портленд, автобус).
путешествие (амтрак, нью_йорк, Вашингтон, поезд).
путешествие (пиплз, нью_йорк, Вашингтон, самолет).
путешествие (пиплз, бирлингтон, нью_йорк, самолет).
можно_путешествовать5 (А, Б, путь (А, Видтранс, Б)): -
путешествие (-, А, Б, Видтранс).
можно_путешествовать5 (А, Б, путь (А, Видтранс, Рпуть)): —
путешествие (_, А, В, Видтранс),
можно_путешествовать5 (В, Б, Рпуть).
Запросы к процедуре "можно_путешествовать5"
На примере следующих запросов можно проиллюстрировать пользование процедурой "можно_пушествовать5".
|? - можно_путешествовать5 (нью_йорк, бостон, П).
П = путь (нью_йорк, поезд, бостон)
Ответ на этот запрос показывает, что существует прямой маршрут ("путь") поездом из Нью-Йорка в Бостон.
|? — можно_путешествовав (нью_йорк, портленд, П).
П = путь (нью_йорк, поезд,
путь (бостон, поезд, портленд));
П = путь (нью_йорк. поезд,
путь (бостон, автобус, портленд))
|? — можно_путешествовать5 (бирлингтон, портленд, П).
П = путь (бирлингтон, самолет,
путь (нью_йорк. поезд,
путь (бостон, поезд, портленд)))
Ответ на последний запрос показывает, что существует маршрут из Бирлингтона в Портленд через Нью-Йорк и Бостон.
2. 3. Списки Представление списков при помощи структуры "./2"
"./2" - это специальная рекурсивная структура, используемая для представления списков произвольной длины. У этой структуры имеется два аргумента. Первым аргументом является терм любого вида, а вторым — либо другая структура "./2", либо сочетание символов [], которое обозначает конец списка.
Нижеследующая структура представляет собой список, состоящий из одного элемента - атома « кетлин»:
. (кетлин, [])
В следующем примере представлен список, состоящий из трех элементов - «альфа», «бета» и «гамма»:
. (альфа,. (бета,. (гамма, [])))
Другая форма представления списка, в которой употребляются квадратные скобки
Запись списков в виде структуры "./2" является громоздкой, поэтому существует иная форма представления списков. Элементы списка располагаются между квадратными скобками и отделяются друг от друга запятыми. При такой форме записи два списка, представленные выше, примут вид:
. [кетлин] [альфа, бета, гамма]
Заметьте, что здесь нет надобности явно указывать конец списка при помощи символов []. Форма записи списков с использованием квадратных скобок и представление списков в виде структуры "./2" полностью взаимозаменяемы.