- •Язык программирования турбо пролог
- •4.4. Переопределение стандартного ввода-вывода
- •4.5. Работа с файлами
- •5. Внутренняя база данных турбо пролога
- •5.1. Объявление внутренней базы данных
- •5.2. Обновление внутренней базы данных
- •5.3. Занесение фактов во время исполнения.
- •5.4. Удаление фактов во время выполнения программы
- •506 Type Error: The functor does not belong to the domain (функтор не относится к данному домену)
- •5.5. Чтение новых фактов иэ файла во время выполнения программы
- •5.6. Сохранение базы данных во время работы программы
- •6. Трассировка и отладка пролог программ
- •6.1. Синтаксическая проверка
- •6.2. Трассировка
- •6.2.1. Директивы трассировки
- •6.2.2. Трассировка в режиме оптимизации: shorttrace
- •6. 2. 3. Трассировка предикатов
- •6.2.4. Предикат trace
- •6.2.5. Диалоговое управление трассировкой
- •6.3. Директивы компилятора и отладка
- •6.4. Сообщения об ошибках во время выполнения программы
- •6.5. Опции компилятора из меню
- •7.Заключение
- •8. Литература:
- •Содержание:
5. Внутренняя база данных турбо пролога
Внутренняя база данных состоит из фактов, которые пользователь может непосредственно добавлять и удалять из программы на Турбо Прологе во время ее исполнения. Для этого необходимо объявить предикаты, описывающие внутреннюю базу данных в секции database программы, и использовать эти предикаты таким же образом, как используются предикаты, описанные в секции predicates.
Для добавления новых фактов в базу данных в Турбо Прологе используются предикаты asserta и assertz, а предикаты retract и retractall служат для удаления существующих фактов. Вы можете изменить содержание вашей базы данных, сначала удалив факт, а потом вставив новую версию этого факта (или совершенно другой факт). Предикат consult считывает факты из файла и добавляет их к внутренней базе данных, a save сохраняет содержимое внутренней секции database в файле.
Так как Турбо Пролог реализует реляционную базу данных как совокупность фактов, его можно использовать как мощный язык запросов к базе данных. Стандартный алгоритм поиска Пролога автоматически выбирает факты с требуемыми значениями параметров и присваивает значения любым неизвестным параметрам, пока алгоритм поиска с возвратом не даст все решения на данный запрос.
Турбо Пролог интерпретирует факты, принадлежащем к базе данных, таким же образом, как обычные предикаты. Факты предикатов внутренней базы, данных хранятся в таблице, их можно легко изменять, тогда как обычные предикаты для достижения максимальной скорости компилируются в двоичный код.
5.1. Объявление внутренней базы данных
Ключевое слово database определяет начало последовательности объявлений предикатов, описывающих внутреннюю базу данных. Во время выполнения с клавиатуры можно с помощью предикатов asserta и assertz добавлять факты (но не правила) в базу данных. Вызвав стандартный предикат consult, вы можете извлечь добавляемые факты из файла на диске. Секция database может выглядеть так же, как в следующем примере: domains
name, address = string age = integer gender = male; female database
person(name,address,age,gender) predicates
male(name, address,age) female(name,address,age) child(name,age,gender) clauses
male(Name, Address,Age) :-
person(Name,Address,Age,male).
....
В этом примере вы можете использовать предикат person таким же образом, как используются другие предикаты (male, female, child). Единственное отличие состоит в том, что вы можете добавлять и удалять факты для предиката person во время работы программы. Следует отметить следующее:
в базу данных можно добавлять только факты, а не правила;
факты базы не могут содержать свободных переменных. Допускается наличие нескольких секций database, но для этого
нужно явно указать имя каждой секции database. Это требуется потому, что consult и save могут загружать и сохранять определенную секцию database по имени.
database – mydatabase
myFirstRelation( integer) mySecondRelation(real, string) myThirdRelation(string)
goal
consult("example. dba", inydatabase), retract(myFirstRelation(1)), asserta( myFirstRelation(O)), save("example.dba",mydatabase).
Такое описание создает базу данных с именем mydatabase. Если вы не дадите имени для внутренней базы данных, то по умолчанию ей присваивается стандартное имя dbasedom.
Важно понимать, что имена предикатов базы данных в модуле являются уникальными. В двух различных секциях database нельзя использовать одинаковые имена предикатов.