Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по языку Пролог.doc
Скачиваний:
83
Добавлен:
28.06.2014
Размер:
507.39 Кб
Скачать

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. Сообщение об ошибке выглядит следующим образом: