ЗАДАНИЕ 5.3

Напишите программу сортировки числового списка методом "пузырька".

6. МОДИФИКАЦИЯ УТВЕРЖДЕНИЙ ПРОГРАММЫ.
РАБОТА С БАЗОЙ ДАННЫХ.

ЦЕЛЬ. Научиться работать с динамическими базами знаний.

 

Встроенные предикаты asserta/1 и assert/1 позволяют добовлять

новые утверждения в базу данных Пролога (в начало и в конец

соответственно), а retract/1 - удалять утверждение, заголовок

которого унифицируется с аргументом. Например, можно составить запрос, который опрашивает пользователя о знании языков:

язык(итальянский).

язык(немецкий).

язык(японский).

язык(французский).

язык(английский).

 

?- write('Введите Ваше имя '),

read(Имя),

язык(Яз),

write('Знаете ли Вы '), write(Яз),

write(' язык'),nl,

read(да),

assert(владеет(Имя,Яз)),fail.

Часто используется предикат retractall/1, удаляющий из базы данных все предложения, заголовки которых унифицируются с аргументом.

Рассмотрим пример базы данных, содержащей информацию, относящуюся к членам клуба: фамилию и возраст, размер членского взноса, а также данные о том, уплачен ли взнос. Такие данные будут представлены в базе фактами, после добавления их командой пополнить_состав(член(…)) (см. ниже в заданиях):

%член(_Фамилия,_Возраст,_Данные_об_уплате)

:-dynamic(член/3).

член('Иванов',15,уплачено).

член('Иванов',33,не_уплачено).

член('Хромов',40,не_уплачено).

Конструкция :-dynamic(член/3) необходима для того, чтобы возможно было изменять базу фактов, связанную с предикатом член/3 с помощью предиката assert во время выполнения. Для безвозвратной отмены действия предиката dynamic используют предикат compile_predicates(List_of_nameArity). После использования этого предиката факты указанные в аргументе не могут быть изменены динамически до конца программы (пример использования: compile_predicates(член/3)).

Размер взноса не указывается, он определяется по возрасту:

 

взнос(Возраст,рублей(1)):-Возраст<18.

взнос(Возраст,рублей(2)):-Возраст>=18.

 

Рассмотрим некоторые операции над базой данных.Внести сведения о новом члене организации:

 

пополнить_состав(Член):-assert(Член).

 

Выдать на терминал сведения о членстве в организации:

выдать_сведения(член(Фамилия,Возраст,Данные_об_уплате)):-

член(Фамилия,Возраст,Данные_об_уплате),

взнос(Возраст,Сумма),

write(член(Фамилия,Возраст,Сумма,Данные_об_уплате)),nl,fail.

выдать_сведения(_).

 

Удалить сведения о членах организации:

 

сократить_состав(Член):-retractall(Член).

Внести данные о том, что член организации уплатил членский взнос:

 

запись_об_уплате(член(Фамилия,Возраст)):-

retract(член(Фамилия,Возраст,не_уплачено)),

assert(член(Фамилия,Возраст,уплачено)).