Ну если задачи, то самая сложная - написание реляционной базы данных на Прологе.
В ФМШ была типа курсовой.
Очень сложно было понять как ее устроить ... вот она, золото мое:
Обратите внимание, что сложнейщая база реализуется очень просто на Прологе.. заметьсте, тут почти все правила на диалоги отведены!!!!
На паскале такакя база была бы раз в 10 больше!
Код
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% ПРОГРАММА КЛУБ %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
retractall(_X):-ВЫП(_X),retract(_X),fail.
retractall(_).
член(Иванов,15,уплачено).
член(Иванов,33,не_уплачено).
член(Хромов,40,не_уплачено).
взнос(_Возраст,рублей(1)):-_Возраст<18.
взнос(_Возраст,рублей(2)):-_Возраст>=18.
пополнить_состав(_Член):-assert(_Член).
выдать_сведения(член(_Фамилия,_Возраст,_Данные_об_уплате)):-
член(_Фамилия,_Возраст,_Данные_об_уплате),
взнос(_Возраст,_Сумма),
ВЫВОД(член(_Фамилия,_Возраст,_Сумма,_Данные_об_уплате)),ПС,
ЛОЖЬ.
выдать_сведения(_).
сократить_состав(_Член):-retractall(_Член).
запись_об_уплате(член(_Фамилия,_Возраст)):-
retract(член(_Фамилия,_Возраст,не_уплачено)),
assert(член(_Фамилия,_Возраст,уплачено)).
установить_счетчик(_Имя,_Начало):-
retractall(счетчик(_Имя,_)),
assert(счетчик(_Имя,_Начало)).
увеличить_счетчик(_Имя,_Прирост):-
retract(счетчик(_Имя,_Значение)),
_Новое_значение ЕСТЬ _Значение+_Прирост,
assert(счетчик(_Имя,_Новое_значение)).
сбросить_счетчик(_Имя,_Значение):-
retract(счетчик(_Имя,_Значение)).
подсчет_членов(член(_Фамилия,_Возраст,_Данные_об_уплате),_):-
установить_счетчик(число_членов,0),
член(_Фамилия,_Возраст,_Данные_об_уплате),
увеличить_счетчик(число_членов,1),
ЛОЖЬ.
подсчет_членов(_,_Счетчик):-
сбросить_счетчик(число_членов,_Счетчик).
цикл.
цикл:-цикл.
меню_клуб:-цикл,ОЧИСТИТЬ,ПС,ПС,
ВЫВОД(' МЕНЮ'),ПС,
ВЫВОД('1. Сведения о членах клуба.'),ПС,
ВЫВОД('2. Посчитать количество членов.'),ПС,
ВЫВОД('3. Добавить запись о члене клуба.'),ПС,
ВЫВОД('4. Удалить запись члена клуба.'),ПС,
ВЫВОД('5. Ввод сведений об уплате'),ПС,
ВЫВОД('6. Удаление неплатильщиков'),ПС,
ВЫВОД('0. ВЫХОД'),ПС,ПС,
ВЫВОД('Введите номер пункта меню'),
ВВОДЦЕЛ(_A),
обр(_A).
обр(_A):-_A=0,!.
обр(_A):-пункт_меню(_A),ЛОЖЬ.
пункт_меню(1):-ОЧИСТИТЬ,ПС,ВЫВОД('Состав клуба:'),
ПС,выдать_сведения(_),ПС,ПС,ВЫВОД('Нажмите ввод для возврата в меню'),ВВОДСИМВ(_).
пункт_меню(2):-ОЧИСТИТЬ,ПС,подсчет_членов(член(_,_,_),_Число),
ВЫВОД('Количество членов клуба = '),
ВЫВОД(_Число),ПС,ПС,ВЫВОД('Нажмите ввод для возврата в меню'),ВВОДСИМВ(_).
пункт_меню(3):-ОЧИСТИТЬ,ПС,ВЫВОД('Введите данные нового члена клуба'),ПС,
ВЫВОД('Фамилия'),readatom(_Фамилия),
ВЫВОД('Возраст'),read(_Возраст),
ВЫВОД('Отметка об уплате взноса'),readatom(_Данные_об_уплате),
пополнить_состав(член(_Фамилия,_Возраст,_Данные_об_уплате)),ПС,ПС,
ВЫВОД('Нажмите ввод для возврата в меню'),ВВОДСИМВ(_).
пункт_меню(4):-ОЧИСТИТЬ,ВЫВОД('удаление записи членства'),ПС,ПС,
выдать_сведения(_),
ВЫВОД('Введите фамилию'),ВВОДСИМВ(_Фамилия),
ВЫВОД('Введите возраст'),ВВОДЦЕЛ(_Возраст),
retract(член(_Фамилия,_Возраст,_)),ПС,ПС,ВЫВОД('Нажмите ввод для возврата в меню'),ВВОДСИМВ(_).
пункт_меню(5):-ОЧИСТИТЬ,ВЫВОД('Ввод сведений об уплате'),ПС,
выдать_сведения(_),ПС,ПС,
ВЫВОД('Введите фамилию'),ВВОДСИМВ(_Фамилия),
ВЫВОД('Возраст'),ВВОДЦЕЛ(_Возраст),
retract(член(_Фамилия,_Возраст,_)),
ВЫВОД('Данные_об_уплате'),ВВОДСИМВ(_Данные_об_уплате),
assert(член(_Фамилия,_Возраст,_Данные_об_уплате)),!.
пункт_меню(6):-ОЧИСТИТЬ,ВЫВОД('Удаление неплатильщиков'),ПС,
retractall(член(_,_,не_уплачено)),ПС,ВЫВОД('Неплатильщики удалены!'),ПС,ПС,
ВЫВОД('Нажмите ввод для возврата в меню'),ВВОДСИМВ(_).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%школьник(_фамилия,_математика,_физика,_информатика).
меню_классный_журнал:-цикл,ОЧИСТИТЬ,ПС,ПС,
ВЫВОД(' МЕНЮ: КЛАССНЫЙ ЖКРНАЛ'),ПС,
ВЫВОД('1. Сведения о сдачи экзаменов за первое полугодие.'),ПС,
ВЫВОД('2. Добавить\изменить сведения о сдачи экзаменов.'),ПС,
ВЫВОД('3. Отчислить неуспевающих.'),ПС,
ВЫВОД('4. Отчислить ученика'),ПС,
ВЫВОД('5. Отчислить всех'),ПС,
ВЫВОД('6. Добавить нового ученика'),ПС,
ВЫВОД('7. Изменить сведения о сдачи для всех'),ПС,
ВЫВОД('0. ВЫХОД'),ПС,ПС,
ВЫВОД('Введите номер пункта меню'),
ВВОДЦЕЛ(_Х),
обработать_к(_Х).
обработать_к(0):-!.
обработать_к(_Х):-пункт_к(_Х),ЛОЖЬ.
сведения_о_сдачи(школьник(_фамилия,_мат,_физ,_инф)):-
школьник(_фамилия,_мат,_физ,_инф),ВЫВОД(_фамилия),ПРОБЕЛЫ(1),
ВЫВОД('МАТЕМАТИКА: '),ВЫВОД(_мат),ПРОБЕЛЫ(1),
ВЫВОД(' ФИЗИКА: '),ВЫВОД(_физ),ПРОБЕЛЫ(1),
ВЫВОД(' ИНФОРМАТИКА: '),ВЫВОД(_инф),ПС,ЛОЖЬ.
сведения_о_сдачи(_).
сдача_мат(школьник(_фам,_м,_ф,_и)):-retract(школьник(_фам,не_сдал,_,_)),assert(школьник(_фам,сдал,_,_)).
сдача_физ(школьник(_фам,_м,_ф,_и)):-retract(школьник(_фам,_,не_сдал,_)),assert(школьник(_фам,_,сдал,_)).
сдача_инф(школьник(_фам,_м,_ф,_и)):-retract(школьник(_фам,_,_,не_сдал)),assert(школьник(_фам,_,_,сдал)).
сдача_д(школьник(_фам,_м,_ф,_и)):-сдача_мат(школьник(_фам,_м,_ф,_и)),сдача_физ(школьник(_фам,_м,_ф,_и)),сдача_инф(школьник(_фам,_м,_ф,_и)).
отчисление_неусп(школьник(_фам,_м,_ф,_и)):-_м=не_сдал;(_ф=не_сдал);(_и=не_сдал),удалить(школьник(_фам,_м,_ф,_и)).
отчислить(школьник(_ф,_,_,_)):-школьник(_ф,_,_,_),retract(школьник(_ф,_,_,_)).
отчислить_всех(_ч):-retractall(школьник(_,_,_,_)).
добавить(школьник(_фамилия,_м,_ф,_и)):-assert(школьник(_фамилия,_м,_ф,_и)).
удалить(_Ч):-retract(_Ч).
пункт_к(1):-ОЧИСТИТЬ,ПС,ВЫВОД('Сведения о сдачи экзаменов'),
ПС,сведения_о_сдачи(_),ПС,ПС,ВЫВОД('нажмите ввод для возврата в меню'),ВВОДСИМВ(_).
пункт_к(2):-ОЧИСТИТЬ,ПС,ВЫВОД('Добавить сведения о сдачи'),ПС,ВЫВОД('Фамилия:'), ВВОДСИМВ(_фам),ПС,
ВЫВОД('Математика:'),ВВОДСИМВ(_мат),ВЫВОД('Физика'),ВВОДСИМВ(_физ),ВЫВОД('Информатика'),ВВОДСИМВ(_инф),
удалить(школьник(_фам,_,_,_)),assert(школьник(_фам,_мат,_физ,_инф)),ВЫВОД('Изменения внесены для продолжения нажмите ввод'),ВВОДСИМВ(_С).
пункт_к(3):-ОЧИСТИТЬ,ПС,ВЫВОД('Неуспевающие отчисляются...'),ПС,
отчисление_неусп(_),ВЫВОД('неуспевающий отчислен!, нажмите ввод'),ВВОДСИМВ(_С).
пункт_к(4):-ОЧИСТИТЬ,ВЫВОД('Введите фамилию:'),ВВОДСИМВ(_фам),удалить(школьник(_фам,_,_,_)),
ВЫВОД('Ученик отчислен,нажмите ввод для возвращения в меню'),ВВОДСИМВ(_В).
пункт_к(5):-ОЧИСТИТЬ,ВЫВОД('Отчисляю...'),ПС,отчислить_всех(_),ВЫВОД(' все отчисленны, нажмите ввод для вывода в меню '),ВВОДСИМВ(_А).
пункт_к(6):-ВЫВОД('Введите фамилию'),ВВОДСИМВ(_фам),ВЫВОД('Введите сведения о сдачи экзаменов'),ПС,
ВЫВОД('Математика'),ВВОДСИМВ(_м),ВЫВОД('Физика'),ВВОДСИМВ(_ф),
ВЫВОД('Информатика'),ВВОДСИМВ(_и),assert(школьник(_фам,_м,_ф,_и)),ВЫВОД('Сведения внесены,нажмите ввод.'),ВВОДСИМВ(_).
пункт_к(7):-ВЫВОД('Введите предмет'),ПС,ВЫВОД('Формат ввода: мат физ инф'),ПС,ВЫВОД('предмет='),ВВОДСИМВ(_предмет),
ПС,ВЫВОД('введите результат сдачи сдал или не_сдал'),ВВОДСИМВ(_изм),изм_сдач(_предмет,_изм).
удалить(_Х):-retract(_Х).
дабавить(_Х):-assert(_Х).
изм_сдач(мат,_изм):-удалить(школьник(_фа,_м,_ф,_и)),добавить(школьник(_фа,_м,_ф,_и)),ЛОЖЬ.
пункт_к(_Ф):-ВЫВОД('ТАКОГО ПУНКТА НЕТ!'),ПС,!.
%?-меню_клуб.
?-меню_классный_журнал.