Задание 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(член(Фамилия,Возраст,уплачено)).