Автор работы: Пользователь скрыл имя, 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
Пример выполнения:
Задание: Телефонная сеть между 5 городами задана БД (X,Y,стоимость 1 минуты). Определить может ли пользователь позвонить из одного заданного пункта в другой и в случае положительного ответа посчитать какое время пользователь может проговорить по телефону при условии наличия у него n у.е., а стоимости складываются при сложении путей.
Ход выполнения:
В среде Visual Prolog 5.2 создан соответствующий проект .
Логика программы: решая задачи с графами в Prolog обычно придерживаются следующей рекурсивной идеи: для нахождения пути из A в Z если A и Z – смежные вершины, то путь найден, иначе нужно найти смежную с Z вершину Y и найти путь из A в Y (рисунок 13). Эту же идею можно использовать «с другой стороны»: для нахождения пути из A в Z если A и Z – смежные вершины, то путь найден, иначе нужно найти смежную с A вершину X и найти путь из X в Z.
Рисунок 13- Идея нахождения пути в Prolog
Для решения нашей задачи основной код может выглядеть следующим образом (в предикате move первый аргумент – это точка отправления, второй – точка назначения, третий – список пройденного пути, четвертый – количество имеющихся денег, пятый – сумма стоимостей минут разговора; предикат is проверяет было ли уже вхождение данного пункта в искомый путь):
move(X,Y,T,K,L):-way(X,Y,F),
term_str(real, M,M1), dlg_Note(" Доступные минуты ", M1),!.
move(X,X,T,K,L):-M=K/L,term_
dlg_Note("Доступные минуты ",M1),!.
move(X,Y,T,K,L):-way(X,Z,F),
Имеющиеся данные о телефонной сети и стоимости переговоров между пунктами описываются фактами way, в которых первые два аргумента отвечают за наименование пунктов, а третий за стоимость телефонных переговоров между ними (данные о телефонной сети необязательно хранить в коде самой программы, для удобства редактирования фактов имеет смысл использованить внешние базы данных). Пусть наша телефонная сеть описывается следующими фактами (рисунок 14):
way(a,b,5). way(b,d,7). way(a,c,6). way(b,c,4). way(c,d,9). way(d,e,10).
Рисунок 14- Граф телефонной сети
Основной листинг программы приведен ниже. Пример экранных форм программы приведен на рисунок 15.
domains
CITY=a;b;c;d;e
R=CITY*
predicates
dlg_mydialog_eh : EHANDLER
dlg_mydialog_handle_answer(
dlg_mydialog_update(DIALOG_
nondeterm way (CITY,CITY,integer)
nondeterm move(CITY,CITY,R, real,integer)
nondeterm is(CITY,R)
clauses
way(a,b,5).
way(b,d,7).
way(a,c,6).
way(b,c,4).
way(c,d,9).
way(d,e,10).
%BEGIN mydialog, idc_ok _CtlInfo
dlg_mydialog_eh(_Win,e_
X=win_GetCtlHandle(_Win,idc_
Y=win_GetCtlHandle(_Win,idc_
Z=win_GetCtlHandle(_Win,idc_
move(X2,Y2,[],Z2,0),!.
move(X,Y,_,K,L):-way(X,Y,F),
term_str(real, M,M1),dlg_Note(" Доступные минуты ", M1),!.
move(X,X,_,K,L):-M=K/L,term_
move(X,Y,T,K,L):-way(X,Z,F),
is(X,[X|_]).
is(X,[A|Y]):-is(X,Y).
Рисунок 15- Экранные формы Prolog-программы
Вывод:
В ходе выполнения работы я научился решать в Prolog задачи, использующие структуру графа.
Цель: Отработка практических навыков по построению экспертных систем в среде Visual Prolog 5.2
Задание: Создать приложение экспертной системы, предназначенное для поддержки принятия решения задачи выбранной предметной области.
Пример выполнения:
Задание: Написать элементарную кулинарную экспертную систему.
Ход выполнения:
В среде Visual Prolog 5.2 создан соответствующий проект. Экпертная система будет работать в двух режимах: режим экперта, в котором можно будет редактировать базу знаний и режим пользователя, в котором пользователь на основе имеющихся ингридиентов сможет определить какое блюдо ему лучше приготовить. Программе предусмотрена как работа со списками (раздел 9.3), так и работа с базами данных.
Основной листинг программы приведен ниже. Пример экранных форм программы приведен на рисунок 16-17.
database - expertdb
blyuda(string,ilist)
numProducts(integer)
products(integer,string)
temp1(string)
temp2(string)
predicates
products2idents(slist,ilist)
idents2products(ilist,slist)
sfirst(slist,string)
ifirst(ilist,integer)
isInclude(slist,string)
ask(slist)
logic(slist,iilist)
check(slist)
my_concat(slist,string)
clauses
products2idents([],[]):-!.
products2idents([Product|
assert(products(Ident,Product)
products2idents(SList,IList),!
idents2products([],[]):-!.
idents2products([Ident|IList],
assert(products(Ident,Product)
idents2products(IList,SList),!
sfirst([X|_],X):-!.
ifirst([X|_],X):-!.
isInclude([Elem|_],Elem):-!.
isInclude([_|List],Elem):-
ask([]):-!.
ask([Product|List]):-concat("
Result=dlg_Ask(Text,["Yes","
assert(temp1(Product),
ask([_|List]):-ask(List),!.
logic([],_):-!.
logic([Blyudo|BList],[
check(Products),assert(temp2(
logic(BList,SList),!.
logic([_|List],[_|SList]):-
check([]):-!.
check([Product|List]):-temp1(
my_concat([],""):-!.
my_concat([X|List],Result):-
concat(X, "\n", Text2),
concat(Text2,Text1,Result),!.
dlg_window_add_blyudo_eh(_Win,
win_Destroy(_Win),!.
dlg_window_add_blyudo_eh(_Win,
findall(X,products(_,X),
ListHandle=win_GetCtlHandle(_
lbox_Add(ListHandle,0,
dlg_window_add_blyudo_eh(_Win,
ifirst(IList,Index),
lbox_Delete(_CtrlWin,Index),!
dlg_window_add_blyudo_eh(_Win,
lbox_GetSel(_CtrlWin,SList,_)
sfirst(SList,Product),
ProductsHandle=win_
Products=lbox_GetAll(
not(isInclude(Products,
lbox_Add(ProductsHandle,0,
dlg_window_add_blyudo_eh(_Win,
dlg_error("Уже выбран"),!.
dlg_window_add_blyudo_eh(_Win,
HandleBlyudo=win_GetCtlHandle(
Blyudo=win_GetText(
not(Blyudo=""),
not(blyuda(Blyudo,_)),
ListHandle=win_GetCtlHandle(_
ProductsList=lbox_GetAll(
products2idents(ProductsList,
assert(blyuda(Blyudo,
dlg_window_add_blyudo_eh(_Win,
dlg_error("пустое значение"),!.
dlg_window_add_blyudo_eh(_Win,
HandleProduct=win_
Product=win_GetText(
not(Product=""),
not(products(_,Product)),
retract(numProducts(Ident),
Ident2=Ident+1,
assert(numProducts(Ident2),
assert(products(Ident,Product)
HandleProductList1=win_
HandleProductList2=win_
lbox_Add(HandleProductList1,
lbox_Add(HandleProductList2,
dlg_window_add_blyudo_eh(_Win,
dlg_error("пустое значение "),!.
dlg_window_view_blyuda_eh(_
findall(X,blyuda(X,_),
ListHandle=win_GetCtlHandle(_
lbox_Add(ListHandle,0,
dlg_window_view_blyuda_eh(_
ListHandle=win_GetCtlHandle(_
lbox_GetSel(ListHandle,SList,
not(Slist=[]),
sfirst(SList,Blyudo),
ifirst(IList,Index),
retract(blyuda(Blyudo,_),
lbox_Delete(ListHandle,Index)
dlg_window_view_blyuda_eh(_
dlg_error("Выберите блюдо"),!.
dlg_window_view_blyuda_eh(_
ListHandle=win_GetCtlHandle(_
lbox_GetSel(ListHandle,SList,
not(Slist=[]),
dlg_window_view_products_
dlg_window_view_products_eh(_
_Parent=win_GetParent(_Win),
ListHandle=win_GetCtlHandle(_
lbox_GetSel(ListHandle,SList,
sfirst(SList,Blyudo),
retract(blyuda(Blyudo,Idents)
assert(blyuda(Blyudo,Idents),
idents2products(Idents,
ListHandle2=win_GetCtlHandle(_
lbox_Add(ListHandle2,0,
dlg_window_user_eh(_Win,e_
save("expert.db",expertdb),!.
dlg_window_user_eh(_Win,e_
ListHandle=win_GetCtlHandle(_
lbox_GetSel(ListHandle,SList,_
sfirst(SList,Blyudo),
retract(blyuda(Blyudo,
assert(blyuda(Blyudo,
idents2products(IdentProducts,
my_concat(Products,Text),
LabelHandle=win_GetCtlHandle(_
concat("you can cook because of: \n",Text,ResultText),
win_SetText(LabelHandle,
dlg_window_user_eh(_Win,e_
retractall(temp1(_),expertdb),
retractall(temp2(_),expertdb),
findall(X,products(_,X),
ask(Products),
findall(Y,blyuda(Y,_),Blyuda),
findall(Z,blyuda(_,Z),
logic(Blyuda,ListProducts),
findall(Y,temp2(Y),
ListHandle=win_GetCtlHandle(_
lbox_Clear(ListHandle),
lbox_Add(ListHandle,0,
FoundBlyuda=[],
LabelHandle=win_GetCtlHandle(_
win_SetText(LabelHandle, "no blyudo"),!.
Рисунок 16- Экранные формы созданной ЭС
Рисунок 17-Экранные формы созданной ЭС
Задание
Реализовать головоломку о Ханойской башне: Имеется три стержня. На левом стержне насажены несколько дисков разных диаметров. Диск с самым большим диаметром находится в самом низу, а диск с самым маленьким диаметром на самом верху. Требуется переложить все диски в той же последовательности с левого стержня на правый, при этом за один ход можно со стрежня на стержень перетащить только один диск и диск большего диаметра нельзя класть на диск меньшего диаметра (рисунок 18).
Рисунок 18 - головоломка «Ханойская башня»
Ход выполнения:
Условно обозначим стержень № 1 буквой А, стержень № 2 – Б, стержень № 3 – В. Логика решения данной головоломки: для перемещения n дисков с А на В используя промежуточный стержень Б нужно:
Как видно из логики здесь возникает рекурсия. Решение задачи требует действий, где n – количество дисков. Если предположить, что за 1 секунду будет произведено 100 действий, то, например, для решения задачи при n=50 понадобиться более 350 000 лет!