- •Язык программирования турбо пролог
- •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.2. Обновление внутренней базы данных
Для того чтобы ввести в программу факты, существует три основных спобоба:
включение фактов в состав вашей секции clauses;
во время выполнения программы с помощью предикатов asserta и assertz;
путем загрузки файла с фактами базы данных с помощью предика та consult.
Все стандартные предикаты Турбо Пролога: asserta, assertz, retract, retractall, consult и save могут иметь один или два аргумента. Необязательный второй аргумент представляет собой имя внутренней базы данных. Обозначение "/1" и "/2" после каждого имени предиката указывает необходимое число аргументов для данной версии предиката. Комментарии после форматов (такие как /* (i) */ и /* (о,i) */ ) показывают поток параметров, для этого предиката.
5.3. Занесение фактов во время исполнения.
Предикат asserta вставляет новый факт в базу данных перед имеющимися фактами для данного предиката, a assertz вставляет факты после данного предиката.
Добавление фактов имеет следующий формат:
аssеrta(<факт>) /* (i) */
аssеrta(<факт>, databaseName) /*(i,i) */
аssеrtz(<факт>) /* (i) */
аssеrtz(<факт>,databaseName) /*(i,i) */
Поскольку имена предикатов базы данных уникальны внутри программы или модуля, для предикатов asserta и assertz всегда известно, куда нужно добавлять факт. Однако для того чтобы обеспечить работу с правильной базой данных можно использовать необязательный второй аргумент.
Использование предиката assert имеет действие аналогичное использованию assertz.
Первый предикат следующего примера вставит факт о Suzanne, описанный предикатом person после всех фактов person, хранящихся в текущий момент в памяти. Второй вставит факт о Michael перед всеми имеющимися фактами предиката person. Третий - вставит факт о John после всех других фактов likes в базе данных likesDatabase, a четвертый - вставит факт о Shannon в той же базе данных перед всеми другими фактами likes.
assertz(person("Suzanne", "New Haven", 35)). asserta(person("Michael", "New York", 26)).
assertz(likes("John", "money"), liesDatabase). asserta(likes("Shannon", "hard work"),likesDatabase).
После вызова этих предикатов база данных б памяти с произвольным обращением будет выглядеть так, как будто вы начали работу со следующими фактами:
/* Внутренняя база данных - dbasedom */ person("Michael", "New York", 26). /* ... другие факты person */ person("Suzanne", "New Haven", 35).
/* Внутренняя база данных - likesDatabase */•
likes("John", "money")
/* ... другие факты likes ... */
1ikes("Shannon", "hard work")
5.4. Удаление фактов во время выполнения программы
Предикат retract удаляет первый факт из базы данных, который совпадает с фактом <факт>. Этот предикат является неопределенным. При поиске с возвратом предикат retract возвращает альтернативные решения и удаляет все совпадающие факты, пока они имеются. Предикат retract имеет следующий формат:
retract(<факт>[, databaseName]) /* (i,i) */
Предположим в программе имеются следующие секции database:
database
реrson(string, string, integer) database - likesDatabase
likes(string, string)
dislikes(string, string) clauses
/* база данных */ ;
person("Fred", "Capitola",35)
person("Fred", "Omaha",37)
person("Michael", "Brooklin",26) /* база данных - likesDatabase */
likes("John", "money") likes("Jane", "money") likes("Chris", "chocolate") likes("John". "broccoli") dislikes("Fred", "broccoli"). dislikes("Michael", "beer").
Имея такие секции database, Прологу можно задать следующие цели:
retract(person("Fred", _,_)). /* 1 */
retract(likes( _, "broccoli")). /* 2 */
retract(likes( _, "money"), likesDatabase). /* 3 */
retract(person("Fred", _, _), likesDatabase)./* 4 */
Первая цель удалит первый факт person o Fred из базы данных dbasedom (имя которой задается по умолчанию). С помощью второй цели из базы данных likesDatabase будет удален первый факт, совпадающий с likes(X, "broccoli"). При этом Турбо Пролог знает, из какой базы производить удаление, поскольку имена предикатов базы данных уникальны: предикат person находится только в неименованной базе данных, a likes только в базе likesDatabase. Третья и четвертая цель показывают, как вы можете использовать для проверки типа второй аргумент. Третья цель успешно реализуется, удаляя первый факт, совпадающий с likes( ,"money") из likesDatabase, а четвертая цель выдаст ошибку, потому что нет (и не может быть) факта person в. базе данных likesDatabase. Сообщение об ошибке выглядит следующим образом: