Автор работы: Пользователь скрыл имя, 26 Мая 2013 в 07:27, курсовая работа
Почти все существующие в настоящее время компьютеры, основаны на ранних, разработанных в 40-х годах идеях фон Неймана и его коллег. Машина фон Неймана содержит большую, состоящую из ячеек, память и процессор, снабженный локальной памятью, ячейки которой называются регистрами. Центральный процессор может загружать данные из памяти в регистры, выполнять арифметические или логические операции над содержимым регистров и отсылать значение из регистра в память.
Программа машины фон Неймана - это последовательность команд выполнения указанных операций вместе с дополнительным множеством команд управления, влияющих на выбор очередной команды.
1 Структурное, функциональное и логическое программирование. 3
2 Основные конструкции языка 6
3 Ход работы 16
3.1Построение треугольника Паскаля 16
3.2 Работа со списками 24
3.3 Работа с внешними базами данных в Prolog 29
3.4 Задачи использующие структуру графа 34
3.5 Построение экспертной системы 39
3.6 Реализация головоломки о Ханоской башне 44
Список использованных источников 53
listall([],L,L).
listall([N|L1],L2,[N|L3]):-
max([X],X):- !.
max([H|Tail],H):-max(Tail,M),
max([_|Tail],M):-max(Tail,M).
dell([Max|Tail], Max, Tail):-!.
dell([H|Tail], Max, [H|Tail1]):-dell(Tail, Max, Tail1).
Основной листинг программы приведен ниже. Пример экранных форм программы приведен на рисунок 12.
predicates
dlg_spiski_eh : EHANDLER
max(ILIST, integer) % поиск максимального элемента
% в объедененом списке
dell(ILIST, integer, ILIST) % удаление максимального
% элемента из списка
slist_ilist(SLIST, ILIST) % перевод строки в число
listall(ILIST,ILIST,ILIST)
clauses
dlg_spiski_Create(Parent):-
win_CreateResDialog(Parent,
max([X],X):- !.
max([H|Tail],H):-max(Tail,M),
max([_|Tail],M):-max(Tail,M).
dell([], _, []):- !. % если список пуст, то конец
dell([Max|Tail], Max, Tail):-!.
dell([H|Tail], Max, [H|Tail1]):-!,dell(Tail, Max, Tail1).
slist_ilist([], []).
slist_ilist([HS|TS], [HI|TI]):- str_int(HS, HI),slist_ilist(TS, TI).
listall([],L,L).
listall([N|L1],L2,[N|L3]):-
%BEGIN Spiski, clear _CtlInfo
dlg_spiski_eh(_Win,e_Control(
HLb1 = win_GetCtlHandle(_Win, lb1),
HLb2 = win_GetCtlHandle(_Win, lb2),
HLbres = win_GetCtlHandle(_Win, lbres),
lbox_Clear(HLb1), % очищаем списки
lbox_Clear(HLb2),
lbox_Clear(HLbres),
!.
%END Spiski, clear _CtlInfo
%BEGIN Spiski, idc_cancel _CtlInfo
dlg_spiski_eh(_Win,e_Control(
win_Destroy(_Win), % закрываем диалог
!.
%END Spiski, idc_cancel _CtlInfo
%BEGIN Spiski, add1 _CtlInfo
dlg_spiski_eh(_Win,e_Control(
HLb1 = win_GetCtlHandle(_Win, lb1),
HBe1 = win_GetCtlHandle(_Win, be1),
StrBe1 = win_GetText(HBe1), % получение значения из строки
StrBe1 <> "", % проверка на «пустоту»
str_int(StrBe1, IntBe1),!, % проверка на число
lbox_Add(HLb1, StrBe1), % добавляем в список значение
win_SetText(HBe1, ""),!. % обнуляем значение строки
dlg_spiski_eh(_Win,e_Control(
dlg_Error("Добавляемое значение не должно быть пустым и строкой!"), !.
%END Spiski, add1 _CtlInfo
%BEGIN Spiski, del1 _CtlInfo
dlg_spiski_eh(_Win,e_Control(
HLb1 = win_GetCtlHandle(_Win, lb1),
lbox_GetSel(HLb1, _, IndList), % возвращает список индексов
IndList = [I|_], % выбирает элемент из списка
lbox_Delete(HLb1, I), % удаляем элемент из списка
!.
%END Spiski, del1 _CtlInfo
%BEGIN Spiski, add2 _CtlInfo
dlg_spiski_eh(_Win,e_Control(
HLb2 = win_GetCtlHandle(_Win, lb2),
HBe2 = win_GetCtlHandle(_Win, be2),
StrBe2 = win_GetText(HBe2), % получение значения из строки
StrBe2 <> "", % проверка на «пустоту»
str_int(StrBe2, IntBe2),!, % проверка на число
lbox_Add(HLb2, StrBe2), % добавляем в список значение
win_SetText(HBe2, ""),!. % обнуляем значение строки
dlg_spiski_eh(_Win,e_Control(
dlg_Error("Добавляемое значение не должно быть пустым и строкой!"), !.
%END Spiski, add2 _CtlInfo
%BEGIN Spiski, del2 _CtlInfo
dlg_spiski_eh(_Win,e_Control(
HLb2 = win_GetCtlHandle(_Win, lb2),
lbox_GetSel(HLb2, _, IndList), % возвращает список индексов
IndList = [I|_], % выбирает элемент из списка
lbox_Delete(HLb2, I),!. % удаляем элемент из списка
%END Spiski, del2 _CtlInfo
%BEGIN Spiski, result _CtlInfo
dlg_spiski_eh(_Win,e_Control(
HLb1 = win_GetCtlHandle(_Win, lb1),
HLb2 = win_GetCtlHandle(_Win, lb2),
HLbres = win_GetCtlHandle(_Win, lbres),
lbox_Clear(HLbres),
StrList1 = lbox_GetAll(HLb1), % возвращает список строк
StrList2 = lbox_GetAll(HLb2), % возвращает список строк
% проверка на заполненость списков -----
Count1 = lbox_CountAll(HLb1),
Count2 = lbox_CountAll(HLb2),
Count1 > 0,
Count2 > 0, !,
slist_ilist(StrList1, IntList1),
slist_ilist(StrList2, IntList2),
listall(IntList1,IntList2,
lbox_Clear(HLbres), % очищаем список, так как будем производить изменения
% значений хранимый в списке
max(IntListRes, Max), % ищем максимальный элемент
dell(IntListRes, Max, Result), % удаляем его
slist_ilist(StrResult, Result),
lbox_Add(HLbres, StrResult), % заносим новый результат в список
str_int(StrMax, Max),
dlg_Note("Удаленный элемент", StrMax), !.
dlg_spiski_eh(_Win,e_Control(
dlg_Error("Оба списка должны быть заполнены!"),!.
Рисунок 12 - Результат работы Prolog-программы
Цель: Отработка практических навыков по работе с внешними базами данными (БД) в среде Visual Prolog 5.2
Примеры заданий:
Пример выполнения
Задание: Даны две таблицы БД. Дополнить первую таблицу данными второй.
Ход выполнения:
В среде Visual Prolog 5.2 создан соответствующий проект .
Логика программы:
Работа с БД в Visual Prolog осуществляется с использованием встроенных предикатов assertz, asserta,consult и т.д. Для добавления первой таблицы данными второй таблицы достаточно воспользоваться предикатом добавления данных в конец таблицы assertz:
add2base([]):- !.
add2base([H|Tail]):-assertz(
Для сохранения базы во внешнем файле необходимо использовать предикат save. Основной листинг программы приведен ниже. Пример экранных форм программы приведен на рисунок 13.
domains
s = string
i = integer
database - base1
bs1(s)
database - base2
bs2(s)
predicates
dlg_base_eh : EHANDLER
add2base(SLIST)
clauses
dlg_base_Create(Parent):-
win_CreateResDialog(Parent,
add2base([]):- !.
add2base([H|Tail]):- assertz(
%MARK Base, new events
%BEGIN Base, e_Create
dlg_base_eh(_Win,e_Create(_
HLb1 = win_GetCtlHandle(_Win, lb1),
HLb2 = win_GetCtlHandle(_Win, lb2),
findall(X, bs1(X), Base2List1), % заносим элементы из базы в список значений
findall(X, bs2(X), Base2List2),
lbox_Add(HLb1, Base2List1),
lbox_Add(HLb2, Base2List2),
!.
%END Base, e_Create
%BEGIN Base, del2 _CtlInfo %кнопка удаления элементов из 2-го списка
dlg_base_eh(_Win,e_Control(
HLb2 = win_GetCtlHandle(_Win, lb2),
lbox_GetSel(HLb2, StrList, _),
StrList = [S|_],
retract(bs2(S)),
findall(X, bs2(X), Base2List),
lbox_Clear(HLb2),
lbox_Add(HLb2, Base2List),!.
%END Base, del2 _CtlInfo
%BEGIN Base, add2 _CtlInfo %кнопка добавления элементов во 2-й список
dlg_base_eh(_Win,e_Control(
HLb2 = win_GetCtlHandle(_Win, lb2),
HBe2 = win_GetCtlHandle(_Win, be2),
StrBe2 = win_GetText(HBe2),
StrBe2 <> "", !,
lbox_Add(HLb2, StrBe2),
assertz(bs2(StrBe2)),
win_SetText(HBe2, ""),!.
dlg_base_eh(_Win,e_Control(
dlg_Error("Добавляемое значение не должно быть пустым!"),!.
%END Base, add2 _CtlInfo
%BEGIN Base, del1 _CtlInfo %кнопка удаления элементов из 1-го списка
dlg_base_eh(_Win,e_Control(
HLb1 = win_GetCtlHandle(_Win, lb1),
lbox_GetSel(HLb1, StrList, _),
StrList = [S|_],
retract(bs1(S)),
findall(X, bs1(X), Base2List),
lbox_Clear(HLb1),
lbox_Add(HLb1, Base2List), !.
%END Base, del1 _CtlInfo
%BEGIN Base, add1 _CtlInfo %кнопка добавления элементов в 1-й список
dlg_base_eh(_Win,e_Control(
HLb1 = win_GetCtlHandle(_Win, lb1),
HBe1 = win_GetCtlHandle(_Win, be1),
StrBe1 = win_GetText(HBe1),
StrBe1 <> "", !,
lbox_Add(HLb1, StrBe1),
assertz(bs1(StrBe1)),
win_SetText(HBe1, ""),!.
dlg_base_eh(_Win,e_Control(
dlg_Error("Добавляемое значение не должно быть пустым!"),
!.
%END Base, add1 _CtlInfo
%BEGIN Base, ñombine _CtlInfo %кнопка объединения
dlg_base_eh(_Win,e_Control(
HLb1 = win_GetCtlHandle(_Win, lb1),
HLb2 = win_GetCtlHandle(_Win, lb2),
Base2List2 = lbox_GetAll(HLb2),
Count2 = lbox_CountAll(HLb2),
Count2 > 0,!,
lbox_Add(HLb1, Base2List2),
add2base(Base2List2), !.
dlg_base_eh(_Win,e_Control(
dlg_Error("Невозможно объединить первую базу с пустой."),
!.
%END Base, ñombine _CtlInfo
%BEGIN Base, clear _CtlInfo %кнопка очищения
dlg_base_eh(_Win,e_Control(
HLb1 = win_GetCtlHandle(_Win, lb1),
HLb2 = win_GetCtlHandle(_Win, lb2),
lbox_Clear(HLb1),
lbox_Clear(HLb2),
retractall(bs1(_)),
retractall(bs2(_)),!.
%END Base, clear _CtlInfo
%BEGIN Base, idc_cancel _CtlInfo
dlg_base_eh(_Win,e_Control(
save("base1.txt", base1),
save("base2.txt", base2), % сохранение баз
win_Destroy(_Win),!.
Рисунок 13- Результат работы программы до и после объединения БД
Вывод:
В ходе выполнения работы я освоил работу с внешними БД в Prolog.
Цель: Отработка практических навыков по решению задач, использующий структуру графа в среде Visual Prolog 5.2
Примеры заданий: