Лабораторная работа №8. Создание динамической базы данных. Предикаты для работы с базой данных
Для описания предикатов динамической базой данных предназначен раздел database. База данных (БД) называется динамической потому, что во время работы можно добавлять, удалять содержащиеся в них утверждения. Другая важная особенность динамических баз данных состоит в том, что она может быть записана на диск и считана с диска в оперативную память.
Иногда предпочтительно иметь часть информации БД в виде утверждений статической БД. Эти данные заносятся в динамическую сразу после активизации программы. В общем случае, предикаты статической БД имеют другое имя, но ту же самую форму представления данных, что и предикаты динамической.
Предикаты для работы с динамической БД:
Asserta заносит новый факт в БД, новый факт помещается перед всеми уже внесенными утверждениями.
Assertz помещает новый факт в БД за всеми имеющимися утверждениями. Retract удаляет утверждение из БД.
Save сохраняет находящуюся в оперативной памяти БД в текстовом файле. Синтаксис этого предиката таков Save(DOS_file_name)
считывает в память файл БД используется для чтения из файла объектов,
относящихся к определенному в программе домену.
Предикат findall позволяет собрать все имеющиеся в базе данные в список, который может быть полезен при дальнейшей работе.
В качестве примера рассмотрим БД по игрокам футбольных команд, БД допускает следующие операции: добавление, удаление и просмотр данных. Эта программа создает БД и содержит её в оперативной памяти. Для работы с ней использовался предикат player с аргументами p_name-имя игрока, k_name-название клуба, p_number-номер игрока, pos-позиция игрока, height -рост, weight-вес, nfl_exp-стаж выступлений, college-учебное заведение)
56
Domains
Программа 32. Динамическая база данных «Футбольная команда»
p_name,k_name, pos, college = string p_number, height, weight, nfl_exp = integer
Database
dplayer(p_name, k_name,p_number,pos, height,weight,nfl_exp, college) Predicates
repeat do_mbase assert_database menu process(integer) clear_database
player(p_name, k_name,p_number,pos, height,weight,nfl_exp, college) error
Goal
do_mbase.
Clauses
repeat.
repeat:-repeat.
/*База данных футбол*/
player("Иванов Иван","Спартак",13,"з", 205,90,3, "ГГПИ"). player("Петров Петр","Динамо",96,"пз", 185,78,4, "ГТК"). player("Сидоров Денис","Локомотив",69,"в", 190,88,2, "ГТУ"). player("Васечкин Илья","Торпедо",5,"в", 195,80,5, "ГГПИ"). player("Алексеев Дима","ЦСКА",1,"н", 165,67,2, "ГТК"). player("Карпов Павел","Зенит",12,"н",170,74,1, "ГКК").
/*конец начальных данных*/ assert_database:-
player(P_name,K_name,P_number,Pos,Height,Weight,Nfl_exp,College), assertz(dplayer(P_name,K_name,P_number,Pos,Height,Weight,Nfl_exp,
College)),
fail. assert_database:-!.
clear_database:- |
|
retract(dplayer(_,_,_,_,_,_,_,_)), |
|
fail. |
|
clear_database:-!. |
|
do_mbase :- |
|
assert_database, |
|
makewindow(1,7,7," FOOTBALL DATABASE ",0,0,25,80), |
|
menu, |
|
clear_database. |
|
menu :- |
|
repeat, clearwindow, |
|
nl, |
|
write(" ************************************* "),nl, |
|
write(" * 1. Добавление нового игрока в БД * "),nl, |
|
write(" * 2. Удаление игрока из БД |
* "),nl, |
write(" * 3. Просмотр данных |
* "),nl, |
write(" * 4. Выход из программы |
* "),nl, |
write(" ************************************* "),nl,
write(" Пожалуйста, сделайте свой выбор 1, 2, 3 or 4 : "), readint(Vibor),nl,process(Vibor),Vibor = 4,!.
/* Добавление информации об игроке в БД */ process(1) :-
makewindow(2,7,7,"Добавление данных",2,20,18,58),shiftwindow(2), write("Введите, пожалуйста:"),nl,
write("Имя игрока: "), readln(P_name), write("Название клуба: "), readln(K_name),
57
write("Номер игрока: "), readint(P_num), |
||
write("Позицию: "), readln(Pos), |
||
write("Рост: "), readint(Ht), |
||
write("Вес: "), readint(Wt), |
||
write("Стаж выступлений: "), readint(Exp), |
||
write("Название учебного заведения: "), readln(College), |
||
assertz(dplayer(P_name, K_name, P_num,Pos,Ht,Wt,Exp, College)), |
||
write(P_name," добавлен в БД"), nl,!, |
||
write("Press space bar. "), readchar(_), |
||
removewindow, shiftwindow(1). |
||
process(2) :- /* Удаление */ |
|
|
makewindow(3,7,7,"Удаление данных",10,30,7,40),shiftwindow(3), |
||
write("Введите имя удаляемого игрока: "), readln(P_name), |
||
retract(dplayer(P_name,_,_,_,_,_,_,_)), |
||
write(P_name," удален из БД "), nl, !, |
||
write("Press space bar."), readchar(_), removewindow, |
||
shiftwindow(1). |
|
|
process(3) :- /* Просмотр данных об игроке*/ |
||
makewindow(4,7,7," Просмотр ", 7,30,16,47), shiftwindow(4), |
||
write("Введите имя для просмотра: "), readln(P_name), |
||
dplayer(P_name,T_name,P_number,Pos,Ht,Wt,Exp,College),nl, |
||
write(" Имя игрока |
|
: ",P_name),nl, |
write(" Название клуба |
: ",T_name),nl, |
|
write(" Номер игрока |
: ",P_number),nl, |
|
write(" Позиция |
: ",Pos),nl, |
|
write(" Рост |
: ",Ht), nl, |
|
write(" Вес |
: ",Wt),nl, |
|
write(" Стаж выступлений : ",Exp), nl, write(" Учебное заведение : ",College),nl, nl,!, write("Press space bar"), readchar(_), removewindow, shiftwindow(1).
process(3) :-
makewindow(5,7,7," Неудача ",14,7,5,60), shiftwindow(5), write("К сожалению, данных нет."),nl,
write("Извините, пока!"),nl,!, write("Press space bar."),readchar(_), removewindow,shiftwindow(1).
process(4) :- /* Выход */
write("До новых встреч! "),readchar(_),exit. /*Обработка ошибки*/
process(Vibor):-
Vibor<1, error; Vibor>5, error.
error:- write("Пожалуйста выберите число от 1 до 4"), write("(Press the spase bar to continue)"),readchar(_).
Задание для самостоятельной работы Модифицируйте программу, добавив в меню пункты:
1)Вывод списка игроков.
2)Сохранение данных в файл.
3)Выборка данных по 1 из трех критериев.
58
Лабораторная работа №9. Применение языка для решения задач ИИ. Создание экспертных систем
Пример 1.Рассмотрим пример ЭС для идентификации породы собак. Она помогает потенциальному хозяину выбрать породу собаки в соответствие с определенными критериями.
Вданной ЭС используются следующие характеристики:
1.Короткая шерсть;
2.Длинная шерсть;
3.Рост меньше 30 дюймов;
4.Рост меньше 22 дюймов;
5.Низкопосаженный хвост;
6.Длинные уши;
7.Хороший характер
8.Вес больше 100 фунтов.
Каждая характеристика для конкретной породы либо верна, либо не верна. Для каждой породы справедливы следующие характеристики:
Таблица 13.
Характеристики собак
Порода |
Характеристики |
Английский бульдог |
1,4,5,7 |
Гончая |
1,4,6,7 |
Дог |
1,3,6,7,8 |
Амер.гончая |
1,5,6,7 |
Кокер-спаниэль |
2,4,5,6,7 |
Ирландский сеттер |
2,3,6 |
Колли |
2,3,5,7 |
Сенбернар |
2,5,7,8 |
*Эксперт по породам собак*/ /*Назначение: Демонстрация работы ЭС*/ Domains
n=integer
list=n*
dog=symbol Predicates
rule(n,dog,list)
cond(n,string)
59
do_expert show_menu do_consulting process(n) test(n,list) topic
repeat Goal
do_expert. Clauses
rule(1,"английский бульдог",[1,4,5,7]). rule(2,"гончая",[1,4,6,7]). rule(3,"дог",[1,3,6,7,8]). rule(4,"американская гончая",[1,5,6,7]). rule(5,"коккер-спаниель",[2,4,5,6,7]). rule(6,"ирландский сеттер",[2,3,6]). rule(7,"колли",[2,3,5,7]). rule(8,"сенбернар",[2,5,7,8]).
/*Характеристики*/ cond(1,"короткошерстная"). cond(2,"длинношерстная"). cond(3,"рост ниже 30 дюймов"). cond(4,"рост ниже 22 дюймов"). cond(5,"низкопосаженный хвост"). cond(6,"большие уши"). cond(7,"хороший характер"). cond(8,"вес более 100 фунтов").
do_expert:-
makewindow(1,7,5 ,"ЭКСПЕРТНАЯ СИСТЕМА",0,0,25,80), show_menu.
repeat. repeat:-repeat.
show_menu:- /*Вывод меню*/ repeat,
write("***************************"),nl, write("*****Добро пожаловать!*****"),nl, write("* *"),nl, write("*****1-консультация********"),nl,
write("*****2-список**************"),nl,
write("*****3-выход***************"),nl,
write("* *"),nl, write("****Сделайте свой выбор****"),nl,
readint(X),
process(X),fail.
/*Обработка 1 пункта меню “Консультация”*/
process(1):- do_consulting, readchar(_), shiftwindow(1), clearwindow.
/*Обработка 2 пункта меню “Вывод списка”*/
process(2):- makewindow(2,7,7,"",5,20,12,25), topic,
readchar(_), shiftwindow(1),
60