Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Conspekt.doc
Скачиваний:
11
Добавлен:
31.08.2019
Размер:
1.39 Mб
Скачать

5.17 Предикаты работы с базой данных .

Пролог-программу можно рассматривать как реляционную базу данных: описание отношений частично присутствует в ней в явном виде (факты), и частично в неявном (правила). Имеются встроенные предикаты, которые позволяют корректировать эту базу в процессе выполнения программы. это делается добавлением к программе новых предложений (предикат assert) или вычеркиванием существующих (предикат retract).

Цель  assert(X) . - всегда успешна и побочным действием пре диката assert(X) является добаление предложения X в БД.

Цель  retract(X) . - приводит к противоположному результату.

?- assert(добавить). ?- retract(добавить).

yes. yes.

?- добавить. ?- добавить.

yes. no.

Пусть существует следующая программа, которую м. рассматривать как БД:

хорошая :- солнечно, not дождь.

необычная :- солнечно, дождь.

дождь.

туман.

?- хорошая. ?- плохая.

no. yes.

?- retract(туман).

yes.

?- assert(солнечно). - позволяет добавлять не только

yes. такие простые факты, но и термы

?- необычная.

yes.

Пусть дана некоторая БД : хорошо(иванов).

удовл(сидоров).

хорошо(смолянинова).

?- assert(лучше(X,Y) :- хорошо(X), удовл(Y).).

?- лучше(смолянинова,иванов).

no.

?- лучше(X,сидоров).

X = иванов;

X = смолянинова;

yes.

retract - кроме того, о чем уже было сказано ранее поз-

воляет удалить несколько фактов, если в ка-

честве предиката задана переменная. С помощью

возвратов можно удалить целое множество пред-

ложений.

?- retract( хорошо(X) ).

yes.

 abolish(P,A). - удаление всех утверждений для процедуры_P

с арностью_A .

 asserta(X). - добавление утв. X в начало БД.

 assertz(X). - -- // -- в конец БД.

?- assert(p(a)), p(a) - в середине

assertz(p(b)), p(b) - в конце

asserta(p(c)). p(c) - в начале

?- p(X).

X = c ;

X = a ;

X = b ;

yes.

Предикат assert позволяет накапливать в БД вычисленные решения. Пусть есть

решение( Задача, Решение ).

?- решение( Задача1, Решение ),

assert( решение( Задача, Решение ) ).

Преимущество такого "запоминания" состоит в том, что следующие ответы на данный вопрос будут получаться быстрее.

ПРИМЕР : Создание таблицы умножения

таблицы :-

L = [ 0,1,2,3,4,5,6,7,8,9 ],

элемент(X,L), элемент(Y,L),

Z is X*Y,

assert(произведение(X,Y,Z)), fail;

succeed.

?- таблица. - такой запрос потерпит неудачу, но будет

создана таблица, к которой затем можно

обращаться:

?- произведение(3,5,Z). ?- произведение(X,Y,8).

Z = 15 ; X = 1 ; Y = 8 ;

X = 2 ; Y = 4 ;

Все множители дающие X = 4 ; Y = 2 ;

произведение = 8 . . .

X = 8 ; Y = 1 ;

Если нужно считывать утверждение из файла, то используют

предикаты consult и reconsult.

 consult(<имя_файла>). - вызывает считывание утверждений из

файла, пока не встретится ко-

нец_файла. Считанные утверждения

будут добавленны в конец БД.

 reconsult(<имя_файла>).-добавляет те утверждения, кото-

рые изменились по отношению к

текущему состоянию. Т.е. утверж-

дения, считываемые в БД, замеща-

ют ранее записанные утверждения

с тем же функтором и арностью.

 save(<имя файла>). - сохранение созданной или измененной

БД в файле.

consult(user) - вводим программу в БД прямо с клавиатуры.

Следует отметить, что после удаления БД необходимо запустить механизм сборки мусора для восстановления памяти.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]