Материал: Методическое пособие по Turbo Prolog (старое)

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам
consult(DOS_file_name) readterm(Domain,Term)

Лабораторная работа №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

Программа 33. «Эксперт по породам собак»

Лабораторная работа №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

Источник: https://studfile.net/preview/16371536/