Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции ОЛП.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
402.94 Кб
Скачать

27. Динамические базы данных. Стандартные предикаты для работы с ними. Примеры применения.

В Прологе имеется 2 вида предикатов, которые описываются в разных разделах логической программы. Одна группа в разделе предикатов, утверждения этого раздела могут быть и фактами, и правилами – называются статическими. Они не могут быть удалены или добавлены в процессе выполнения программы. Их нельзя записать на диск. Другая группа описывается в разделе database. Утверждения этого раздела могут быть только фактами, при выполнении программы они могут быть удалены, добавлены, записаны на диск или считаны с него. Следовательно, база данных, состоящая из предикатов раздела database, называется динамической. Раздел database быть именованным и безымянным. Безымянный раздел описывается просто словом database, а именованный -сло­вами database - имя (например, database - players). Имена соответствующих пре­дикатов секций database и predicates должны быть различными, например, play­ers и dplayers.

Для работы с динамической базой данных в Прологе имеются стан­дартные предикаты:

1) assert( ), asserta( ), assertz( ) - для ввода предикатов динамической базы данных в базу знаний.

2) retract(), retractall() - для удаления предикатов динамической базы из ба­зы знаний.

3) save(), consult( ) - для записи в файл и считывания из файла пре­дикатов динамической БД.

Форматы предикатов ввода и вывода фактов динамической базы данных одинаковы и имеют вид:

предикат(имя факта, имя БД). Для безымянных баз данных второй параметр отсутствует.

Например: assert(player("Misha" , futbolist, 10), igroki). assert( likes("Misha", knigi))

В первом случае факт, указанный в скобках, вставляется в именованную базу данных igroki, а во втором - в безымянную.

Предикаты assert( ) и asserta( ) вставляют факты в начало динамической ба­зы данных, а предикат assertz() - в конец.

Предикат retract( ) удаляет по одному факту динамической базы, начиная с первого, а предикат retractall() удаляет сразу все факты, указанные в его параметре.

Например: retract(player(X, futbolist, _)). retractall(player(X, futbolist, _)).

Последний предикат удалит из базы данных всех футболистов.

Следует обратить внимание на то, что все текущие изменения динамичес­кой базы данных выполняются только в оперативной памяти компьютера и на исходном тексте набранной логической программы не отражаются.

Предикаты save() и retract() имеют формат: предикат (полное имя файла на диске, имя БД).

Второй параметр указывается только для именованной базы данных.

С помощью этих предикатов можно загружать и выгружать предварительно созданные и записанные на диск в виде текстового файла динамические базы данных.

Пример программы с динамической базой данных.

domains name= string sub, place = symbol school = integer

prl=dteacher(name, sub, school) pr2=dholyday(name,plce)

database dteacher(name, sub, school)

database – holyday dholyday (name, plce)

predicates teacher(name, sub, school) holyday(name, pice)

inbase outbase teacherhl(sub, school)

vvl(prl) vv2(pr2) udl(prl) ud2(pr2)

clauses

dteacher("Пeтpoв", физика, 20).

teachег("Богданов", алгебра, 34). teасhег("Михайлов", химия, 22).

holyday(“'Петров”, дача). holyday(“ Михайлов”, горы).

inbase:- write("вв фамилию учителя"), nl, readln(Ft),

write("BB преподаваемый предмет"), nl,

readln(Sb), write("BB номер щколы"), nl, readint(Sn),

write("BB вид отдыха учителя"), nl,

readln(Hl), vvl(dteacher(Fm,Sb,Sn)),

vv2(dholyday(Fm,Hi).

vvl(dteacher(Fm,Sb,Sn)):- assert(dteacher(Ft, Sb, Sn)).

vv2(dholyday(Fm,Hl)):- asserta(dholyday(Ft, HI), holyday).

28. Графические средства Турбо-пролога. Примеры применения.

Средства инициализации графики, закрытия и построения графических примитивов как в Pascal.

detectgraph(gd,gm). initgraph(gd,gm,ngd,ngm,graphpath.bgi).

Makewindow (N, c1,c2, "текст",x,y,h,w) - N - номер окна, с1- цвет экрана, c2 – цвет рамки х, у- координаты верхнего левого угла, h- высота в строках, w- ширина в строках.

Shiftwindow (n)- позволяет переключать вывод на окно n. После закрытия окна открывается предыдущее.

Gotowindow (n)- считается быстрее.

Clearwindow - удаление из текущего окна всего содержимого.

Removewindow- удаление текущего окна с экрана.

В любом окне можно установить указатель - cursor (y,x). Для вывода можно использовать обычный предикат вывода - write ("текст").

initgraf:-initgraph(0,0,_,_,"c:\prolog\egavga.bgi"),

cleardevice,setbkcolor(0),setcolor(8),

outtextxy(290,10," Рисунок "),

circle(320,240,70),

circle(290,220,4),circle(350,220,4),

setcolor(9),pieslice(320,245,90,450,10),

setcolor(2),bar(300,100,340,170),

bar(250,100,310,120),

pieslice(320,270,180,360,22),

readchar(_),restorecrtmode,clearwindow,menu.

29. Модульное программирование. Организация меню. Пример.

Базируется на принципе создания проектов. Важным средством являются структурные диаграммы. С их помощью можно наглядно представить как доменную структуру данных, так и структуру программы модулей. Сложная исходная задача разбивается на подзадачи меньшей сложности и т. д. Такое разбиение можно выполнять, пока подзадача не будет представлена на уровне ее реализации. Достоинства: 1) Возможность создания библиотек; 2) Простота тестирования модулей; 3) Возможность развития системы; 4) Возможность модернизации отдельных модулей; 5) Простота содержательного восприятия сложных систем.

Базируется на понятиях проект, глобальное определение. Проект состоит из нескольких модулей, под модулем в проекте понимается глобальный независимый модуль, который может храниться на диске. Модули могут обмениваться между собой данными.

Процесс создания проекта: 1) описание проекта; 2) описание глобальных определений; 3) создание модулей; 4) компиляция модулей; 5) работа.

1— выполняется с помощью пункта главного меню edit/prj, затем вводится имя файла проекта с расширением prj. В окне редактора вводят имена модулей, соединенные "+", затем файл записывают на диск.

2— общие компоненты всех модулей описываются словом global. Глобальными могут быть разделы доменов, баз данных и предикатов. Все глобальные определения пишут до локальных. Целесообразно их записывать в виде отдельного файла на диске и включать с помощью команды include. Описание модуля имеет структуру: Project "myproject" Include "commonfile"

Реализация модуля.

Пример: разработать два модуля- main и sub.

Main.pro, sub.pro. Mypro.prj Globaldef.pro - описание определений.

Main + sub

Global domains /* Создаем файл глобальных определений.*/

Name=string

Global predicates

Print (name)- (i)

Записывается в виде файла. 3 этап:

Создаем файлы модулей—

1-й /*main prog*/

project "my prj"

include "a: globfl def.pro"

predicates test

goal test

clauses test:-write("Имя?"),nl, readln (Tname), privet (Tname)

/*subpro*/

project "my prj"

include "a: globaldef.pro"

clauses privet (Name):- write ("Привет", Name), nl.