Автор работы: Пользователь скрыл имя, 28 Мая 2013 в 02:44, курсовая работа
Задание
Реализовать головоломку о Ханойской башне: Имеется три стержня. На левом стержне насажены несколько дисков разных диаметров. Диск с самым большим диаметром находится в самом низу, а диск с самым маленьким диаметром на самом верху. Требуется переложить все диски в той же последовательности с левого стержня на правый, при этом за один ход можно со стрежня на стержень перетащить только один диск и диск большего диаметра нельзя класть на диск меньшего диаметра (рис. 1).
1 Задание 3
2 Ход выполнения работы 4
Список использованных источников 12
Содержание
1 Задание 3
2 Ход выполнения работы 4
Список использованных источников 12
Задание
Реализовать головоломку о Ханойской башне: Имеется три стержня. На левом стержне насажены несколько дисков разных диаметров. Диск с самым большим диаметром находится в самом низу, а диск с самым маленьким диаметром на самом верху. Требуется переложить все диски в той же последовательности с левого стержня на правый, при этом за один ход можно со стрежня на стержень перетащить только один диск и диск большего диаметра нельзя класть на диск меньшего диаметра (рис. 1).
Рис. 1 - головоломка «Ханойская башня»
Ход выполнения
Как видно из логики здесь возникает рекурсия. Решение задачи требует действий, где n – количество дисков. Если предположить, что за 1 секунду будет произведено 100 действий, то, например, для решения задачи при n=50 понадобиться более 350 000 лет!
Для простоты изложения рассмотрим решение задачи для n=3. Количество необходимых действий в этом случае равно 7. Необходимо предпринять следующие действия:
В консоли решение данной задачи может быть реализовано следующим образом:
domains
loc =right;middle;left
predicates
hanoi(integer)
move(integer,loc,loc,loc)
inform(loc,loc)
clauses
hanoi(N):- move(N,left,middle,
move(1,A,_,C):-inform(A,C),!.
move(N,A,B,C):-N1=N-1,move(N1,
inform(Loc1, Loc2):-write("\nДиск перемещается с стержня ", Loc1, " на стержень ", Loc2).
GOAL
hanoi(5).
В Visual Prolog 5.2 cоздан проект Tower.pro. Этапы создания и редактирования проекта Visual Prolog описаны в разделах.
Основной листинг проекта Tower приведен ниже:
domains
loc =right;middle;left
facts - coor
xy(loc,integer)%промежуточная
facts - d
n(loc,integer)%промежуточная
facts - posx
ps(loc,integer)% координаты x
facts - coorxy
pol(integer,integer,integer)% координаты; 1-номер диска, 2-х,3-у
facts - locat
k(integer,integer,integer)% координаты; 1-номер диска, 2-х,3-у
predicates
dlg_tower_eh : EHANDLER
dlg_tower_handle_answer(
dlg_tower_update(DIALOG_VAL_
nondeterm move(integer,loc,loc,loc)
% предикат для нахождения
nondeterm pick(WINDOW)% предикат для рисования
nondeterm coordin(loc,loc)% предикат для занесения в базы данных различных координат
nondeterm zapol(integer,integer,integer)
nondeterm proverka(string)% предикат на коректность ввода
clauses
ps(left,60).
ps(middle,260).
ps(right,460).
%BEGIN Tower, idc_push_button _CtlInfo
dlg_tower_eh(_Win,e_Control(
retractall(xy(_,_),coor),
retractall(k(_,_,_),locat),P=
WIN1=win_GetCtlHandle(_WIN,
win_SetState(WIN1,[wsf_
%END Tower, idc_push_button _CtlInfo
%BEGIN Tower, idc_ok _CtlInfo
dlg_tower_eh(_Win,e_Control(
WIN1=win_GetCtlHandle(_WIN,
assertz(xy(left,240),coor),
D=win_GetCtlHandle(_WIN,idc_d)
not(pick(_Win)),!.
%END Tower, idc_ok _CtlInfo
%BEGIN Tower, e_MouseDown
dlg_tower_eh(_Win,e_MouseDown(
k(C,B,D),retract(k(C,B,D),
pol(D,X,Y),retract(pol(D,X,Y),
not(pick(_Win)),!.
dlg_tower_eh(_Win,e_Update(_
proverka(A):-str_int(A,B),B>=
proverka(_):-dlg_MessageBox("
zapol(A,B,C):-A<=B,A1=A+1,
retract(xy(left,_),coor),C1=C-
zapol(_,_,_):-!.
move(1,A,_,C):- coordin(A,C),!
move(N,A,B,C):- N1=N-1,move(
coordin(A,B):-xy(A,N),
N1=N+10,retract(xy(A,N),coor),
xy(B,M),M1=M-10,retract(xy(B,
n(A,F),retract(n(A,F),d),
ps(B,H),assertz(k(H,M,F),
pick(Win):-
Pic=pict_getfromres(idb_
pict_Draw(Win,Pic,pnt(0,80),
Picture=pict_getfromres(idb_
pict_Destroy (Pic), % удаляем картинку из памяти
D1=win_GetCtlHandle(WIN,idc_d)
pict_Draw(Win,Picture,pnt(60,
pict_Draw(Win,Picture,pnt(
pict_Draw(Win,Picture,pnt(
pict_Destroy (Picture),
P2>=1,pol(1,A1,B1),
Picture1=pict_getfromres(idb_
pict_Draw(Win,Picture1,pnt(A1,
pict_Destroy (Picture1),
P2>=2,pol(2,A2,B2),
Picture2=pict_getfromres(idb_
pict_Draw(Win,Picture2,pnt(
pict_Destroy (Picture2),
P2>=3,pol(3,A3,B3),
Picture3=pict_getfromres(idb_
pict_Draw(Win,Picture3,pnt(
pict_Destroy (Picture3),
P2>=4,pol(4,A4,B4),
Picture4=pict_getfromres(idb_
pict_Draw(Win,Picture4,pnt(
pict_Destroy (Picture4),
P2>=5,pol(5,A5,B5),
Picture5=pict_getfromres(idb_
pict_Draw(Win,Picture5,pnt(
pict_Destroy (Picture5),
P2>=6,pol(6,A6,B6),
Picture6=pict_getfromres(idb_
pict_Draw(Win,Picture6,pnt(
pict_Destroy (Picture6),
P2>=7,pol(7,A7,B7),
Picture7=pict_getfromres(idb_
pict_Draw(Win,Picture7,pnt(
pict_Destroy (Picture7),
P2>=8,pol(8,A8,B8),
Picture8=pict_getfromres(idb_
pict_Draw(Win,Picture8,pnt(
pict_Destroy (Picture8),
P2>=9,pol(9,A9,B9),
Picture9=pict_getfromres(idb_
pict_Draw(Win,Picture9,pnt(
pict_Destroy (Picture9),
P2>=10,pol(10,A10,B10),
Picture10=pict_getfromres(
pict_Draw(Win,Picture10,pnt(
pict_Destroy (Picture10),
P2>10.
В программе введены следующие обозначения типов данных:
loc =right;middle;left - описывает положение диска на одном из трех стержней (слева, посередине или справа).
В программе определены следующие предикаты:
move(integer,loc,loc,loc) - предикат для нахождения самого решения. Первый аргумент – номер диска, остальные три аргумента – это три стержня
pick(WINDOW) – предикат для отображения картинок. Аргумент - окно на которое производится отображение
coordin(loc,loc) – предикат для обновление БД coor, d, locat. Первый аргумент – стержень, с которого взяли диск, второй аргумент – стержень, на который этот диск надели
zapol(integer,integer,integer) – предикат для заполнения БД d, coorxy, coor первоначальными данными. Первый аргумент – номер диска, второй аргумент – общее количество дисков, третий – координаты расположения диска по оси OY
proverka(string) – предикат для проверки на корректность значения, введенного пользователем. Аргумент – данные, введенные пользователем
В программе определены следующие БД:
facts – coor
xy(loc,integer)
БД со знаниями о координатах по оси OY свободного места на каждом стержне. Первый аргумент – название стержня, второй – координата
facts - d
n(loc,integer)
БД со знанием номера диска, который лежит на самом верху каждого из стержней. Первый аргумент – название стержня, второй – номер диска
facts - posx
ps(loc,integer)
БД со знанием координат по оси OX каждого из стержней. В процессе работы программы эта БД никак не обновляется. Первый аргумент – название стержня, второй – координата.
facts - coorxy
pol(integer,integer,integer)
БД со знанием координат каждого диска. Первый аргумент – номер диска, второй – координата по оси OX, третий – координата по оси OY
facts - locat
k(integer,integer,integer)
БД, в которой хранится информация о последовательности перемещения дисков. Первый аргумент – номер диска, второй – координата по оси OX, третий – координата по оси OY
С помощью предиката proverka проверяется правильность введенного пользователем значения. В случае успеха с помощью предиката zapol заполняются базы данных первоначальными значениями (в БД d сохраняются данные о том, что все диски находятся на левом стержне, в БД coorxy сохраняются данные координат каждого диска, а в БД coor сохраняются ординаты свободного места для каждого из стержней). Далее управление передается предикату move, который собственно находит решение задачи и все необходимые данные сохраняет в промежуточной БД locat (с помощью предиката coordin). После всего этого вызывается предикат pick, который отвечает за отображение всех необходимых картинок на форме. При каждом нажатии на кнопку мыши обновляется БД coorxy с помощью БД locat и происходит вызов предиката pick. При нажатии на кнопку «Обновить» удаляются все данные из БД d, coor, coorxy, locat.
Созданная программа представлена на рис. 2 - 4.
Рис. 2. - Начало решения задачи
Рис. 3. - Четвертый шаг решения
Рис. 4. - Окончание решения
Список использованных источников
1. Лорьер Ж, Системы искусственного интеллекта/ Ж.Л. Лорьер.-М: Мир, 1990. – 345с.
2. Братко И. С, Программирование на языке Пролог для искусственного интеллекта/ И.С. Братко. - М: Мир,1990. – 456с.
3. Попов Э. В, Экспертные системы/ Э.В. Попов. - М: Наука, 1987. – 789с.
4. Марселлус Д, Программирование экспертных систем на Турбо Прологе/ Д. В. Марселлус. - М: Финансы и статистика, 1994. – 434с.
5. Соломон Я, Программирование на Турбо Прологе/ Я. Соломон - М: Наука, 1994. - 234с.
6. Уотермен У, Руководство по экспертным системам / У. Уотермен -М: Мир, 1986. – 354с.
7. Гриб Д. Логический подход к искусственному интеллекту / Д. Гриб - М: Мир, 1985. – 345с.
8. Шапиро В.С. Искусство программирования на языке Пролог / В.С. Шапиро - М: Наука, 1985. – 451с.
9. Нейлор М. Как построить свою экспертную систему / М. Нейлор - М: Мир, 1992. – 287с.