logo search
TurboProlog / Документация / TOM_1

Удаление фактов во время выполнения программы

Предикат retract удаляет первый факт в вашей базе данных, который

совпадает с фактом <факт>. Этот предикат является неопределенным. При по-

иске с возвратом предикат retract возвращает альтернативные решения и

удаляет все совпадающие факты, пока они имеются, после чего он не находит

нужных фактов. Предикат retract имеет следующий формат:

retract(<факт>[, databaseName]) /* (i,i) */

Предположим в вашей программе имеются следующие секции database:

database

person(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 о Fred из базы данных dbasedom

(имя которой задается по умолчанию). С помощью второй цели из базы данных

likesDatabase будет удален первый факт, совпадающий с likes(X,

"broccoli"). При этом, Турбо Пролог знает из какой базы производить уда-

ление, поскольку имена предикатов базы данных уникальны: предикат person

находится только в неименованной базе данных, а likes только в базе

likesDatabase.

Третья и четвертая цель показывают, как вы можете использовать для

проверки типа второй аргумент. Третья цель успешно реализуется, удаляя

первый факт, совпадающий с likes(,"money") из likesDatabase, а четвертая

цель выдаст ошибку, потому что нет (и не может быть) факта person в базе

данных likesDatabase. Сообщение об ошибке выглядит следующим образом:

506 Type Error: The functor does not belong to the domain

(функтор не относится к даннму домену)

Следующая цель иллюстрирует, как вы можете получить значения из пре-

диката retract:

goal

retract(person(Name, Age)),

write(Name, ", ", Age),

fail.

Вы можете также удалить все факты из заданной секции database с по-

мощью предиката retract. Если при вызове retract в качестве первого аргу-

мента будет указана свободная переменная, то чтобы определить, из какой

секции database нужно произвести удаление, он будет анализировать второй

аргумент. Например:

goal

retract(X, mydatabase),

write(X),

fail.