Динамическая БД в прологе

Автор работы: Пользователь скрыл имя, 26 Декабря 2012 в 19:55, курсовая работа

Краткое описание

Пролог (фр. Programmation en Logique) – язык и система логического программирования, основанная на языке предикатов математической логики дизъюнктов Хорна, представляющей собой подмножество логики предикатов первого порядка.
Основными понятиями в языке Пролог являются факты, правила логического вывода и запросы, позволяющие описывать базы знаний, процедуры логического вывода и принятия решений.

Содержание работы

Введение……………………………………………...…………….………...04
Постановка задачи… …..……………………………..………………….….05
Теоретическая часть……………………………….………..……………….06
Описание предикатов………………………………………………….…….07
Текст программы…………………………………………………………….08
Тестирование программы…………………………….………….………..…11
Руководство для пользователя……………………………….….………..…12
Заключение ……………………...…….…………………………………..…16
Литература……………………………………………………….………..….17
Приложение. Графическая часть проекта……………………………….…18

Содержимое работы - 1 файл

содержание1.doc

— 519.00 Кб (Скачать файл)

 

СОДЕРЖАНИЕ

Введение……………………………………………...…………….………...04

Постановка задачи… …..……………………………..………………….….05

Теоретическая часть……………………………….………..……………….06

Описание предикатов………………………………………………….…….07

Текст программы…………………………………………………………….08

Тестирование программы…………………………….………….………..…11

Руководство для пользователя……………………………….….………..…12

Заключение ……………………...…….…………………………………..…16

Литература……………………………………………………….………..….17

Приложение. Графическая  часть проекта……………………………….…18

 

ВВЕДЕНИЕ

Пролог (фр. Programmation en Logique) – язык и система логического программирования, основанная на языке предикатов математической логики дизъюнктов Хорна, представляющей собой подмножество логики предикатов первого порядка.

Основными понятиями в языке  Пролог являются факты, правила логического вывода и запросы, позволяющие описывать базы знаний, процедуры логического вывода и принятия решений.

Факты в языке Пролог описываются логическими предикатами  с конкретными значениями. Правила в Прологе записываются в форме правил логического вывода с логическими заключениями и списком логических условий.

Особую роль в интерпретаторе Пролога  играют конкретные запросы к базам знаний, на которые система логического программирования генерирует ответы «истина» и «ложь». Для обобщённых запросов с переменными в качестве аргументов созданная система Пролог выводит конкретные данные в подтверждение истинности обобщённых сведений и правил вывода.

Факты в базах знаний на языке  Пролог представляют конкретные сведения (знания). Обобщённые сведения и знания в языке Пролог задаются правилами логического вывода (определениями) и наборами таких правил вывода (определений) над конкретными фактами и обобщёнными сведениями.

Начало истории языка  относится к 1970-м годам. Будучи декларативным языком программирования, Пролог воспринимает в качестве программы некоторое описание задачи или баз знаний и сам производит логический вывод, а также поиск решения задач, пользуясь механизмом поиска с возвратом и унификацией.

 

  1. Постановка задачи

 

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

Разработать оболочку БД, позволяющую выполнять следующие  операции:

  1. Вводить, удалять и редактировать записи БД.
  2. Сортировать записи по любому полю и выводить отсортированный список на экран.
  3. Выдавать на экран информацию типа: «все мужчины от 1980 до 1985 года рождения» (ограничения задаются по полям «пол» и «возраст»).

Нужная операция выбирается из меню.

 

  1. Теоретическая часть

 

Visual Prolog имеет встроенные средства для работы с двумя типами баз данных: внутренними и внешними. Внутренние базы данных так называются потому, что они обрабатываются исключительно в оперативной памяти компьютера, в отличие от внешних баз данных, которые могут обрабатываться на диске или в памяти. Поэтому работа с ними существенно быстрее чем с внешними БД.  С другой стороны, емкость оперативной памяти, как правило, намного меньше, чем емкость внешней памяти. Отсюда следует, что объем внешней базы данных может быть существенно больше объема внутренней базы данных.

Динамическая база данных – это база данных, в которую время от времени требуется вносить изменения, отражающие изменения структуры описываемой системы. Предикаты базы  данных описываются в разделе facts, который должен располагаться в программе перед разделом predicates. Все утверждения с предикатами, описанными в разделе facts, составляют динамическую БД, которая, в отличие от неизменяемой статической  БД,  являющейся частью кода программы, в процессе работы программы может меняться, т.е. из нее можно  удалять любые содержащиеся в ней утверждения, а также добавлять новые.

Один из методов реализации динамической базы данных заключается в деструктивном редактировании базы данных при необходимости внесения в нее изменений. К сожалению, при деструктивном редактировании исчезает возможность возврата к состоянию базы данных, существовавшему ранее. Это затрудняет анализ изменений базы данных. 

 

 

  1. Описание предикатов

 

show_menu – отображает на экране пункты меню.

 

process(char) – выполняет введенный пункт меню

 

run – предикат осуществляющий запуск программы.

 

sort(list, list) (string*,string*) – предикат вызывающий сортировку списка. Первый список это список который надо отсортировать. Второй список уже отсортированный.

 

past(string,list,list) – предикат осуществляющий саму сортировку методом вставки.

 

sort1(list1, list1) (integer*,integer*) – предикат вызывающий сортировку списка. Первый список это список который надо отсортировать. Второй список уже отсортированный. В отличии от предиката sortэтот предикат работает с целочисленными типами.

 

past1(integer,list1,list1) – предикат осуществляющий саму сортировку методом вставки. В отличии от предиката past этот предикат работает с целочисленными типами.

 

write_spisok(list) – выводит элементы списка по одному в столбик.

 

poisk1(pol,jar,jar) – осуществляет поиск записей из БД по ключам pol, jar,jar.

 

  1. Текст программы

 

domains

name,fam,pol = string

jar = integer

file = f  

list=string*

list1=integer*

database  

student(fam,name,pol,jar) 

 

predicates  

process(char)   

show_menu

nondeterm run   

nondeterm sort(list, list)

nondeterm past(string,list,list)

nondeterm write_spisok(list)

nondeterm sort1(list1, list1)

nondeterm past1(integer,list1,list1)

nondeterm poisk1(pol,jar,jar)

nondeterm write_s(list1)

 

clauses

 

  sort([],[]).

  sort([H|T],RestL):-

        upper_lower(H,H1),

        sort(T,RestT),past(H1,RestT,RestL).

 

past(Sym,[],[Sym]).

past(Sym,[H|T],[Sym,H|T]):-Sym<=H.

past(Sym,[H|T],[H|T1]):-Sym>H,past(Sym,T,T1).

 

sort1([],[]).

        sort1([H|T],RestL):-sort1(T,RestT),past1(H,RestT,RestL).

 

past1(Sym,[],[Sym]).

past1(Sym,[H|T],[Sym,H|T]):-Sym<=H.

past1(Sym,[H|T],[H|T1]):-Sym>H,past1(Sym,T,T1).

 

write_s([]). 

write_s([H|T]):-

student(Fam,Name,Pol,Jar),

H=Jar,

write("Фамилия: "),write(Fam),write(" "),

   write("Имя: "),write(Name),write(" "),

   write("Год рождения: "),write(Jar),write(" "),

   nl,write_s(T).

  write_s([H|T]):-

   student(Fam,Name,Pol,Jar),

H<>Jar,

nl,write_s(T).

 

  write_spisok([]).

  write_spisok([H|T]):-

   write(H),nl,

   write_spisok(T).

   

  poisk1(" ",_,_).

  poisk1(Sex,Jar1,Jar2):-

   student(Fam,Name,Pol,Jar),

   Sex = Pol,

   Jar1<=Jar,

   Jar<=Jar2,

   write("Фамилия: "),write(Fam),write(" "),

   write("Имя: "),write(Name),write(" "),

   write("Год рождения: "),write(Jar),write(" "),

   nl,fail,

   poisk1(Sex,Jar1,Jar2).

  poisk1(Sex,Jar1,Jar2):-

   student(Fam,Name,Pol,Jar),

   Sex<>Pol,fail, poisk1(Sex,Jar1,Jar2).

 

show_menu :-

  nl,

  write("1 – Добавить терм."), nl,

  write("2 – Сортировать по фамилиям."), nl,  

  write("3 – Сортировать по именам."), nl,

  write("4 – Сортировать по году рождения."), nl,

  write("5 – Удаление терма из БД."), nl,

  write("6 – Просмотр БД."), nl,

  write("7 – Редактирование записей."), nl,

  write("8 – Поиск фамилий"),nl,

  write("0 - Выход."), nl,readchar(C),

  write(C), nl,

  process(C).

 

process('1') :-

write("Введите Фамилию "), nl,

readln(Fam),

write("Введите имя"), nl,

readln(Name),

write("Введите пол"), nl,

readln(Sex),

write("Введите год рождения"), nl,

readint(Jar),

assertz(student(Fam, Name,Sex,Jar)),

show_menu.

 

process('2') :-

findall(Fam,student(Fam,_,_,_),L),

sort(L,L1),

write_spisok(L1),

show_menu.

 

process('3') :-

findall(Name,student(_,Name,_,_),L),

sort(L,L1),

write_spisok(L1),

show_menu.

 

process('4') :-

findall(Jar,student(_,_,_,Jar),L),

sort1(L,L1),

write_s(L1),

show_menu.

 

process('5') :-

write("Введите фамилию студента"), nl,

readln(Fam),

retract(student(Fam, _,_,_)), 

show_menu.

 

process('6') :-

student(Fam, Name,Sex,Jar),

write(Fam), write(" "), write(Name),write(" "),write(Sex), write(" "), write(Jar),nl,  fail,

show_menu. 

 

process('7') :-

  write("Введите фамилию"), nl,

readln(Fam1),

retract(student(Fam1, _,_,_)), 

write("Введите новую фамилию"), nl,

readln(Fam),

write("Введите имя"), nl,

readln(Name),

write("Введите пол"), nl,

readln(Sex),

write("Введите год рождения"), nl,

readint(Jar),

assertz(student(Fam, Name,Sex,Jar)),

show_menu.

 

process('8') :-

  write("Введите пол"), nl,

readln(Sex),

write("Введите первый год"),nl,

readint(Jar1),

write("Введите второй год"),nl,

readint(Jar2),

poisk1(Sex,Jar1,Jar2),

show_menu.

  

process('0'):-

save("bd.txt"),

retractall(_).

 

process(_) :-

show_menu. 

  

run :-

existfile("bd.txt"), !,

consult("bd.txt"),  

show_menu.

 

run :-

openwrite(f, "bd.txt"),

closefile(f),

show_menu.   

goal     

run.

 

 

 

 

 

 

 

 

 

  1. Тестирование программы

 

При загрузке программы и создании базы данных появляется окно с пунктами меню, показанное на рисунке 5.1:

 

 

Рисунок 5.1 – Программа после загрузки

 

При выборе 1-го пункта меню нужно будет  ввести запись о студенте(см. рисунок 5.2):

 

 

Рисунок 5.2 – Пункт добавление терма

 

 

  1. Руководство пользователя

 

Для того чтобы запустить программу  необходимо зайти в папку проекта  Term. Затем нужно зайти в папку Exe и запустить приложение GOAL$000.EXE. После чего запустится следующее приложение (см. Рисунок 6.1).

 

 

Рисунок 6.1 – Приложение при его  загрузке

 

В меню каждой операции соответствует  уникальное число. Для выбора конкретной операции нужно ввести соответсвующее ей число.

При выборе первого пункта нужно будет ввести запись о студенте (см. рисунки 6.2)

 

 

Рисунок 6.2 – Добавление терма

 

 

При выборе второго пункта меню выполнится сортировка фамилий студентов по алфавиту. Пример показан на рисунке 6.3.

 

Рисунок 6.3 – результат сортировки фамилий

 

При выборе второго пункта меню выполнится сортировка имён студентов по алфавиту. Пример показан на рисунке 6.4.

 

 

Рисунок 6.4 – результат сортировки имён

 

 

 

 

При выборе четвёртого пункта меню выполнится сортировка имён студентов по году рождения. Пример показан на рисунке 6.5.

 

 

Рисунок 6.5 – сортировка имён по году рождения

 

При выборе пятого пункта меню произойдёт уделение записи. При выборе 6-го пункта нам выведет всё содержимое БД.(см. рис 6.6 ).

 

 

Рисунок 6.6 – вывод содержимого БД

 

При выборе седьмого пункта запись можно редактировать по фамилии.При выборе восьмого нам выдаст все имена и фамилии студентов которые соответствуют введёным данным.(рис 6.7).

Информация о работе Динамическая БД в прологе