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

Занесение фактов во время исполнения

Предикат asserta вставляет новый факт в базу данных перед имеющимися

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

предиката.

Добавление фактов имеет следующий формат:

asserta(<факт>) /* (i) */

asserta(<факт>,databaseName) /* (i,i) */

assertz(<факт>) /* (i) */

assertz(<факт>,databaseName) /* (i,i) */

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

или модуля, для предикатов asserta и assertz всегда известно, куда нужно

добавлять факт. Однако, для того, чтобы обеспечить работу с правильной

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

второй аргумент.

Использование предиката assert имеет действие аналогичное использо-

ванию assertz.

Первый предикат следующего примера вставит факт о Suzanne, описанный

предикатом person, после всех фактов person, хранящихся в текущий момент

в памяти. Второй вставит факт о Michael перед всеми имеющимися фактами

предиката person. Третий - вставит факт о John после всех других фактов

likes в базе данных likesDatabase, а четвертый - вставит факт о Shannon в

той же базе данных перед всеми другими фактами likes.

assertz(person("Suzanne", "New Haven", 35)).

asserta(person("Michael", "New York", 26)).

assertz(likes("John", "money"),likesDatabase).

asserta(likes("Shannon", "hard work"),likesDatabase).

После вызова этих предикатов база данных в памяти с произвольным об-

ращением будет выглядеть так, как будто вы начали работу со следующими

фактами:

/* Внутренняя база данных - dbasedom */

person("Michael", "New York", 26).

/* ... другие факты person ... */

person("Suzanne", "New Haven", 35).

/* Внутренняя база данных - likesDatabase */

likes("John", "money")

/* ... другие факты likes ... */

likes("Shannon", "hard work")