Автор работы: Пользователь скрыл имя, 26 Декабря 2012 в 19:55, курсовая работа
Пролог (фр. Programmation en Logique) – язык и система логического программирования, основанная на языке предикатов математической логики дизъюнктов Хорна, представляющей собой подмножество логики предикатов первого порядка.
Основными понятиями в языке Пролог являются факты, правила логического вывода и запросы, позволяющие описывать базы знаний, процедуры логического вывода и принятия решений.
Введение……………………………………………...…………….………...04
Постановка задачи… …..……………………………..………………….….05
Теоретическая часть……………………………….………..……………….06
Описание предикатов………………………………………………….…….07
Текст программы…………………………………………………………….08
Тестирование программы…………………………….………….………..…11
Руководство для пользователя……………………………….….………..…12
Заключение ……………………...…….…………………………………..…16
Литература……………………………………………………….………..….17
Приложение. Графическая часть проекта……………………………….…18
СОДЕРЖАНИЕ
Введение……………………………………………...……
Постановка задачи… …..……………………………..………………….….05
Теоретическая часть……………………………….………..……………….
Описание предикатов……………………………
Текст программы………………………………………………………
Тестирование программы…………………………….………….……….
Руководство для пользователя……………………………….…
Заключение ……………………...…….……………
Литература……………………………………………………
Приложение. Графическая часть проекта……………………………….…18
ВВЕДЕНИЕ
Пролог (фр. Programmation en Logique) – язык и система логического программирования, основанная на языке предикатов математической логики дизъюнктов Хорна, представляющей собой подмножество логики предикатов первого порядка.
Основными понятиями в языке Пролог являются факты, правила логического вывода и запросы, позволяющие описывать базы знаний, процедуры логического вывода и принятия решений.
Факты в языке Пролог
описываются логическими
Особую роль в интерпретаторе Пролога играют конкретные запросы к базам знаний, на которые система логического программирования генерирует ответы «истина» и «ложь». Для обобщённых запросов с переменными в качестве аргументов созданная система Пролог выводит конкретные данные в подтверждение истинности обобщённых сведений и правил вывода.
Факты в базах знаний на языке Пролог представляют конкретные сведения (знания). Обобщённые сведения и знания в языке Пролог задаются правилами логического вывода (определениями) и наборами таких правил вывода (определений) над конкретными фактами и обобщёнными сведениями.
Начало истории языка
относится к 1970-м годам. Будучи декларати
Создать динамическую базу данных о студентах группы для каждого из которых указывается фамилия, имя, пол и год рождения.
Разработать оболочку БД,
позволяющую выполнять
Нужная операция выбирается из меню.
Visual Prolog имеет встроенные средства для работы с двумя типами баз данных: внутренними и внешними. Внутренние базы данных так называются потому, что они обрабатываются исключительно в оперативной памяти компьютера, в отличие от внешних баз данных, которые могут обрабатываться на диске или в памяти. Поэтому работа с ними существенно быстрее чем с внешними БД. С другой стороны, емкость оперативной памяти, как правило, намного меньше, чем емкость внешней памяти. Отсюда следует, что объем внешней базы данных может быть существенно больше объема внутренней базы данных.
Динамическая база данных – это база данных, в которую время от времени требуется вносить изменения, отражающие изменения структуры описываемой системы. Предикаты базы данных описываются в разделе facts, который должен располагаться в программе перед разделом predicates. Все утверждения с предикатами, описанными в разделе facts, составляют динамическую БД, которая, в отличие от неизменяемой статической БД, являющейся частью кода программы, в процессе работы программы может меняться, т.е. из нее можно удалять любые содержащиеся в ней утверждения, а также добавлять новые.
Один из методов реализации динамическо
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.
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,
past(Sym,[],[Sym]).
past(Sym,[H|T],[Sym,H|T]):-
past(Sym,[H|T],[H|T1]):-Sym>H,
sort1([],[]).
sort1([H|T],RestL):-sort1(T,
past1(Sym,[],[Sym]).
past1(Sym,[H|T],[Sym,H|T]):-
past1(Sym,[H|T],[H|T1]):-Sym>
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,_,_,_)
sort(L,L1),
write_spisok(L1),
show_menu.
process('3') :-
findall(Name,student(_,Name,_,
sort(L,L1),
write_spisok(L1),
show_menu.
process('4') :-
findall(Jar,student(_,_,_,Jar)
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.
При загрузке программы и создании базы данных появляется окно с пунктами меню, показанное на рисунке 5.1:
Рисунок 5.1 – Программа после загрузки
При выборе 1-го пункта меню нужно будет ввести запись о студенте(см. рисунок 5.2):
Рисунок 5.2 – Пункт добавление терма
Для того чтобы запустить программу необходимо зайти в папку проекта 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).