Программирование на прологе.
Вопрос у меня такой: Кто может в прологе "Скомпилировать" программу, текст которой я привожу ниже, и скинуть результат сюда. Возможности сделать самому в данный момент нет, а нужно очень.
Код:
GLOBAL DOMAINS
m=a*
a=a(i,j)
j=integer
i=integer
GLOBAL DATABASE
wall(i,j)
predicates
%wall(i,j) %Есть стена
finish(i,j) %Финиш
nondetermmember(a,m) %Проверяем были мы в данной клетке ранее
или нет
nondetermway(a,m,m,integer,integer) %3 аргумент - сколько было
пройдено клеток, 4-кол-во открытых дверей
nondeterm all(m)
квадрат (window,i,i) %вывод квадрата
цифры(window,m,i)
10
clauses
%Конец пути
finish(1,1).
%Вход в лабиринт
all(P):-way(a(10,10),P,[a(10,10)],1,0),!. %Начальная координата 10,10.
Была пройдена 1 клетка (ступили на 10,10). Открыто 0 дверей. Отсечение
выводит 1 вариант
%Если финиш
way(a(I,J),[a(I,J)],_,_,9):- finish(I,J). %Должно быть открыто 9 дверей
перед тем как можно будет выйти
%Идём вверх
%Если двери нет и не были в данной клетке, то путь есть
way(a(I,J),[a(I,J)|P],Was,KolOpen,KolDoor):-
K = I-1,
not(wall(K,J)), %Если нет стены
K>=1, K<=10, %Проверка
not(member(a(K,J), Was)), %Если не были в данной комнате
KolOpen2=KolOpen+1, %Количество пройденных дверей
увеличиваем на 1
way(a(K,J),P,[a(K,J)|Was],KolOpen2,KolDoor). %Идём дальше
%Если есть дверь, не были в данной клетке и было пройдено 8
клеток ранее, то путь через стену есть
way(a(I,J),[a(I,J)|P],Was,8,KolDoor):-
K = I-1,
wall(K,J), %Если стена
not(member(a(K,J), Was)), %Если не были в данной комнате
KolOpen2=0, %Количество пройденных дверей обнуляем, т.к.
прошли через дверь
KolDoor2=KolDoor+1, %Количество открытых дверей увеличивается
way(a(K,J),P,[a(K,J)|Was],KolOpen2,KolDoor2). %Идём дальше
11
%Идём вниз
%Если двери нет и не были в данной клетке, то путь есть
way(a(I,J),[a(I,J)|P],Was,KolOpen,KolDoor) :-
K = I+1,
not(wall(K,J)), %Если нет стены
K>=1, K<=10, %Проверка
not(member(a(K,J), Was)), %Если не были в данной комнате
KolOpen2=KolOpen+1, %Количество пройденных дверей
увеличиваем на 1
way(a(K,J),P,[a(K,J)|Was],KolOpen2,KolDoor). %Идём дальше
%Если есть дверь, не были в данной клетке и было пройдено 8
клеток ранее, то путь через стену есть
way(a(I,J),[a(I,J)|P],Was,8,KolDoor) :-
K = I+1,
wall(K,J), %Если стена
not(member(a(K,J), Was)), %Если не были в данной комнате
KolOpen2=0, %Количество пройденных дверей обнуляем, т.к.
прошли через дверь
KolDoor2=KolDoor+1, %Количество открытых дверей увеличивается
way(a(K,J),P,[a(K,J)|Was],KolOpen2,KolDoor2). %Идём дальше
%Идём влево
%Если двери нет и не были в данной клетке, то путь есть
way(a(I,J),[a(I,J)|P],Was,KolOpen,KolDoor) :-
L = J-1,
not(wall(I,L)), %Если нет стены
L>=1, L<=10, %Проверка
not(member(a(I,L), Was)), %Если не были в данной комнате
KolOpen2=KolOpen+1, %Количество пройденных дверей
увеличиваем на 1
way(a(I,L),P,[a(I,L)|Was],KolOpen2,KolDoor). %Идём дальше
12
%Если есть дверь, не были в данной клетке и было пройдено 8
клеток ранее, то путь через стену
есть
way(a(I,J),[a(I,J)|P],Was,8,KolDoor) :-
L = J-1,
wall(I,L), %Если стена
not(member(a(I,L), Was)), %Если не были в данной комнате
KolOpen2=0, %Количество пройденных дверей обнуляем, т.к.
прошли через дверь
KolDoor2=KolDoor+1, %Количество открытых дверей увеличивается
way(a(I,L),P,[a(I,L)|Was],KolOpen2,KolDoor2). %Идём дальше
%Идём вправо
%Если двери нет и не были в данной клетке, то путь есть
way(a(I,J),[a(I,J)|P],Was,KolOpen,KolDoor) :-
L = J+1,
not(wall(I,L)), %Если нет стены
L>=1, L<=10, %Проверка
not(member(a(I,L), Was)), %Если не были в данной комнате
KolOpen2=KolOpen+1, %Количество пройденных дверей
увеличиваем на 1
way(a(I,L),P,[a(I,L)|Was],KolOpen2,KolDoor). %Идём дальше
%Если есть дверь, не были в данной клетке и было пройдено 8
клеток ранее, то путь через стену
есть
way(a(I,J),[a(I,J)|P],Was,8,KolDoor) :-
L = J+1,
wall(I,L), %Если стена
not(member(a(I,L), Was)), %Если не были в данной комнате
KolOpen2=0, %Количество пройденных дверей обнуляем, т.к.
прошли через дверь
KolDoor2=KolDoor+1, %Количество открытых дверей увеличивается
way(a(I,L),P,[a(I,L)|Was],KolOpen2,KolDoor2). %Идём дальше
13
%Проверяем были мы в данной клетке ранее или нет
member(I,[I|_]).
member(I,[_|P]):-member(I,P).
predicates
task_win_eh : EHANDLER
constants
%BEGIN Task Window, CreateParms, 20:14:02-11.3.2016, Code
automatically updated!
task_win_Flags =
[wsf_SizeBorder,wsf_TitleBar,wsf_Close,wsf_Maximize,wsf_Minimize,wsf_Clip
Siblings]
task_win_Menu = res_menu(idr_task_menu)
task_win_Title = "Lab1"
task_win_Help = idh_contents
%END Task Window, CreateParms
clauses
task_win_eh(_Win,e_Create(_),0):-!,
dlg_ввод_и_вывод_информации_Create (_Win),
win_Destroy (_Win),
!.
task_win_eh(_Win,e_Menu(id_help_contents,_ShiftCtlAlt),0):-!,
vpi_ShowHelp("lab1.hlp"),
!.
task_win_eh(Win,e_Menu(id_help_about,_ShiftCtlAlt),0):-!,
14
dlg_about_dialog_Create(Win),
!.
task_win_eh(Win,e_Menu(id_file_exit,_ShiftCtlAlt),0):-!,
win_Destroy(Win),
!.
task_win_eh(_Win,e_Size(_Width,_Height),0):-!,
ifdef use_tbar
toolbar_Resize(_Win),
enddef
ifdef use_message
msg_Resize(_Win),
enddef
!.
%END Task Window, e_Size
%END_WIN Task Window
project_ShowHelpContext(HelpTopic):-
vpi_ShowHelpContext("lab1.hlp",HelpTopic).
goal
ifdef use_mdi
vpi_SetAttrVal(attr_win_mdi,b_true),
enddef
ifdef ws_win
ifdef use_3dctrl
vpi_SetAttrVal(attr_win_3dcontrols,b_true),
enddef
enddef
15
vpi_Init(task_win_Flags,task_win_eh,task_win_Menu,"lab1",task_win_Title).
constants
%BEGIN About dialog, CreateParms, 20:14:02-11.3.2016, Code
automatically updated!
dlg_about_dialog_ResID = idd_dlg_about
dlg_about_dialog_DlgType = wd_Modal
dlg_about_dialog_Help = idh_contents
%END About dialog, CreateParms
predicates
dlg_about_dialog_eh : EHANDLER
clauses
dlg_about_dialog_Create(Parent):-
win_CreateResDialog(Parent,dlg_about_dialog_DlgType,dlg_about_dialog_ResID
,dlg_about_dial og_eh,0).
%BEGIN About dialog, idc_ok _CtlInfo
dlg_about_dialog_eh(_Win,e_Control(idc_ok,_CtrlType,_CtrlWin,_CtrlInfo),0):-!,
win_Destroy(_Win),
!.
%END About dialog, idc_ok _CtlInfo
%MARK About dialog, new events
dlg_about_dialog_eh(_,_,_):-!,fail.
constants
16
dlg_ввод_и_вывод_информации_ResID =
idd_ввод_и_вывод_информации
dlg_ввод_и_вывод_информации_DlgType = wd_Modal
dlg_ввод_и_вывод_информации_Help = idh_contents
predicates
dlg_ввод_и_вывод_информации_eh : EHANDLER
dlg_ввод_и_вывод_информации_handle_answer(INTEGER
EndButton,DIALOG_VAL_LIST)
dlg_ввод_и_вывод_информации_update(DIALOG_VAL_LIST)
clauses
dlg_ввод_и_вывод_информации_Create(Parent):-
%MARK Ввод и вывод информации, new variables
dialog_CreateModal(Parent,dlg_ввод_и_вывод_информации_ResID,"",
[
df(idc_текст1,editstr("",[]),nopr),
df(idc_текст3,editstr("",[]),nopr),
df(idc_текст5,editstr("",[]),nopr),
df(idc_текст7,editstr("",[]),nopr),
df(idc_текст9,editstr("",[]),nopr),
df(idc_текст11,editstr("",[]),nopr),
df(idc_текст13,editstr("",[]),nopr),
df(idc_текст15,editstr("",[]),nopr),
df(idc_текст16,editstr("",[]),nopr),
df(idc_текст14,editstr("",[]),nopr),
df(idc_текст12,editstr("",[]),nopr),
df(idc_текст10,editstr("",[]),nopr),
17
df(idc_текст8,editstr("",[]),nopr),
df(idc_текст6,editstr("",[]),nopr),
df(idc_текст4,editstr("",[]),nopr),
df(idc_текст2,editstr("",[]),nopr)
%END Ввод и вывод информации, ControlList
],
dlg_ввод_и_вывод_информации_eh,0,VALLIST,ANSWER),
dlg_ввод_и_вывод_информации_handle_answer(ANSWER,VALLIST).
dlg_ввод_и_вывод_информации_handle_answer(idc_ok,VALLIST):-!,
dlg_ввод_и_вывод_информации_update(VALLIST).
dlg_ввод_и_вывод_информации_handle_answer(idc_cancel,_):-!. %
Handle Esc and Cancel here
dlg_ввод_и_вывод_информации_handle_answer(_,_):-
errorexit().
dlg_ввод_и_вывод_информации_update(_VALLIST):-
%BEGIN Ввод и вывод информации, Update controls, 20:50:02-3.6.2016,
Code automatically updated!
_IDC_ТЕКСТ1_VALUE = dialog_VLGetstr(idc_текст1,_VALLIST),
_IDC_ТЕКСТ3_VALUE = dialog_VLGetstr(idc_текст3,_VALLIST),
_IDC_ТЕКСТ5_VALUE = dialog_VLGetstr(idc_текст5,_VALLIST),
_IDC_ТЕКСТ7_VALUE = dialog_VLGetstr(idc_текст7,_VALLIST),
_IDC_ТЕКСТ9_VALUE = dialog_VLGetstr(idc_текст9,_VALLIST),
_IDC_ТЕКСТ11_VALUE = dialog_VLGetstr(idc_текст11,_VALLIST),
_IDC_ТЕКСТ13_VALUE = dialog_VLGetstr(idc_текст13,_VALLIST),
_IDC_ТЕКСТ15_VALUE = dialog_VLGetstr(idc_текст15,_VALLIST),
_IDC_ТЕКСТ16_VALUE = dialog_VLGetstr(idc_текст16,_VALLIST),
_IDC_ТЕКСТ17_VALUE = dialog_VLGetstr(idc_текст17,_VALLIST),
_IDC_ТЕКСТ18_VALUE = dialog_VLGetstr(idc_текст18,_VALLIST),
_IDC_ТЕКСТ14_VALUE = dialog_VLGetstr(idc_текст14,_VALLIST),
_IDC_ТЕКСТ12_VALUE = dialog_VLGetstr(idc_текст12,_VALLIST),
18
_IDC_ТЕКСТ10_VALUE = dialog_VLGetstr(idc_текст10,_VALLIST),
_IDC_ТЕКСТ8_VALUE = dialog_VLGetstr(idc_текст8,_VALLIST),
_IDC_ТЕКСТ6_VALUE = dialog_VLGetstr(idc_текст6,_VALLIST),
_IDC_ТЕКСТ4_VALUE = dialog_VLGetstr(idc_текст4,_VALLIST),
_IDC_ТЕКСТ2_VALUE = dialog_VLGetstr(idc_текст2,_VALLIST),
%END Ввод и вывод информации, Updatecontrols
true.
%MARK Ввод и вывод информации, newevents
%BEGIN Ввод и вывод информации, idc_ввод _CtlInfo
dlg_ввод_и_вывод_информации_eh(_Win,e_Control(idc_ввод,_CtrlType,
_CtrlWin,_CtlInfo),0):-
%Вывод картинки
Picture = pict_GetFromRes (idb_s),
pict_Draw(_Win,Picture,pnt(20,20),rop_SrcCopy),
Текст1 = win_GetCtlHandle (_Win,idc_текст1), Текст2 =
win_GetCtlHandle (_Win,idc_текст2),
Текст3 = win_GetCtlHandle (_Win,idc_текст3), Текст4 =
win_GetCtlHandle (_Win,idc_текст4),
Текст5 = win_GetCtlHandle (_Win,idc_текст5), Текст6 =
win_GetCtlHandle (_Win,idc_текст6),
Текст7 = win_GetCtlHandle (_Win,idc_текст7), Текст8 =
win_GetCtlHandle (_Win,idc_текст8),
Текст9 = win_GetCtlHandle (_Win,idc_текст9), Текст10 =
win_GetCtlHandle (_Win,idc_текст10),
Текст11 = win_GetCtlHandle (_Win,idc_текст11), Текст12 =
win_GetCtlHandle (_Win,idc_текст12),
Текст13 = win_GetCtlHandle (_Win,idc_текст13), Текст14 =
win_GetCtlHandle (_Win,idc_текст14),
Текст15 = win_GetCtlHandle (_Win,idc_текст15), Текст16 =
win_GetCtlHandle (_Win,idc_текст16),
19
Текст17 = win_GetCtlHandle (_Win,idc_текст17), Текст18 =
win_GetCtlHandle (_Win,idc_текст18),
ТекстНовый1 = win_GetText (Текст1), ТекстНовый2 = win_GetText
(Текст2),
ТекстНовый3 = win_GetText (Текст3), ТекстНовый4 = win_GetText
(Текст4),
ТекстНовый5 = win_GetText (Текст5), ТекстНовый6 = win_GetText
(Текст6),
ТекстНовый7 = win_GetText (Текст7), ТекстНовый8 = win_GetText
(Текст8),
ТекстНовый9 = win_GetText (Текст9), ТекстНовый10 = win_GetText
(Текст10),
ТекстНовый11 = win_GetText (Текст11), ТекстНовый12 =
win_GetText (Текст12),
ТекстНовый13 = win_GetText (Текст13), ТекстНовый14 =
win_GetText (Текст14),
ТекстНовый15 = win_GetText (Текст15), ТекстНовый16 =
win_GetText (Текст16),
ТекстНовый17 = win_GetText (Текст17), ТекстНовый18 =
win_GetText (Текст18),
ТекстНовый1 <> "", ТекстНовый2 <> "", ТекстНовый3 <> "",
ТекстНовый4 <>
"",
ТекстНовый5 <> "", ТекстНовый6 <> "", ТекстНовый7 <> "",
ТекстНовый8 <>
"",
ТекстНовый9 <> "", ТекстНовый10 <> "", ТекстНовый11 <> "",
ТекстНовый12 <>
"",
ТекстНовый13 <> "", ТекстНовый14 <> "", ТекстНовый15 <> "",
ТекстНовый16 <>
"",
ТекстНовый17 <> "", ТекстНовый18 <> "",
%ПРОВЕРКИ НА ТО ЧТОБЫ БЫЛИ ВВЕДЕНЫ РАЗНЫЕ
НАЧАЛЬНЫЕ ГРАНИЦЫ
str_int(ТекстНовый1,Число1), str_int(ТекстНовый2,Число2),
str_int(ТекстНовый3,Число3), str_int(ТекстНовый4,Число4),
str_int(ТекстНовый5,Число5), str_int(ТекстНовый6,Число6),
str_int(ТекстНовый7,Число7), str_int(ТекстНовый8,Число8),
str_int(ТекстНовый9,Число9), str_int(ТекстНовый10,Число10),
str_int(ТекстНовый11,Число11), str_int(ТекстНовый12,Число12),
str_int(ТекстНовый13,Число13), str_int(ТекстНовый14,Число14),
str_int(ТекстНовый15,Число15), str_int(ТекстНовый16,Число16),
20
str_int(ТекстНовый17,Число17), str_int(ТекстНовый18,Число18),
Число1>=1,Число1<=10,Число2>=1,Число2<=10,Число3>=1,Число3<=10,Чис
ло4>=1,Число4
<=10,
Число5>=1,Число5<=10,Число6>=1,Число6<=10,Число7>=1,Число7<=10,Чис
ло8>=1,Число8
<=10,
Число9>=1,Число9<=10,Число10>=1,Число10<=10,Число11>=1,Число11<=10
,Число12>=1, Число12<=10,
Число13>=1,Число13<=10,Число14>=1,Число14<=10,Число15>=1,Число15<=
10,Число16>= 1,Число16<=10,
квадрат(_Win,Число1,Число2),
квадрат(_Win,Число3,Число4),
квадрат(_Win,Число5,Число6),
квадрат(_Win,Число7,Число8),
квадрат(_Win,Число9,Число10),
квадрат(_Win,Число11,Число12),
квадрат(_Win,Число13,Число14),
квадрат(_Win,Число15,Число16),
квадрат(_Win,Число17,Число18),
retractall(wall(_,_)),
assert(wall(Число1,Число2)),
assert(wall(Число3,Число4)),
assert(wall(Число5,Число6)),
assert(wall(Число7,Число8)),
assert(wall(Число9,Число10)),
assert(wall(Число11,Число12)),
assert(wall(Число13,Число14)),
assert(wall(Число15,Число16)),
21
assert(wall(Число17,Число18)),
all(P), !,
цифры(_Win,P,0),
!.
dlg_ввод_и_вывод_информации_eh(_Win,e_Control(idc_ввод,_CtrlType,_Ctrl
Win,_CtlInfo),0):-!,
dlg_note ("Некорректный ввод данных или путь не найден!"),
!.
dlg_ввод_и_вывод_информации_eh(_,_,_):-!,fail.
%ВЫВОД КВАДРАТА
квадрат (_Win,XX,YY):-
win_SetBrush(_Win,brush(pat_Solid,color_Black)),
%draw_Rect (_Win, rct(60,55,110,105)),
X=XX-1,
X1=X*50,
X11=X1+58,
X22=X1+108,
Y=YY-1,
Y1=Y*50,
Y11=Y1+52,
Y22=Y1+103,
draw_Rect (_Win, rct(Y11,X11,Y22,X22)),!.
цифры(_Win,[],N).
цифры(_Win,[a(XX,YY)|P],N):-
X=XX-1,
X1=X*49,
X11=X1+73,
Y=YY-1,
Y1=Y*49,
Y11=Y1+68,
N1=N+1,
str_int(Text,N1),
draw_Text(_Win, Y11, X11, Text),
%вывод в листбокс
HandleListBox = win_GetCtlHandle (_Win,idc_lb),
str_int(I1,XX),
str_int(J1,YY),
concat("Координата: (", I1, String0),
concat(String0, ",", String2),
concat(String2, J1, String3),
concat(String3, ")", String4),
Len = lbox_CountAll(HandleListBox),%Длина
lbox_add(HandleListBox, Len, String4),
цифры(_Win,P,N1),!
m=a*
a=a(i,j)
j=integer
i=integer
GLOBAL DATABASE
wall(i,j)
predicates
%wall(i,j) %Есть стена
finish(i,j) %Финиш
nondetermmember(a,m) %Проверяем были мы в данной клетке ранее
или нет
nondetermway(a,m,m,integer,integer) %3 аргумент - сколько было
пройдено клеток, 4-кол-во открытых дверей
nondeterm all(m)
квадрат (window,i,i) %вывод квадрата
цифры(window,m,i)
10
clauses
%Конец пути
finish(1,1).
%Вход в лабиринт
all(P):-way(a(10,10),P,[a(10,10)],1,0),!. %Начальная координата 10,10.
Была пройдена 1 клетка (ступили на 10,10). Открыто 0 дверей. Отсечение
выводит 1 вариант
%Если финиш
way(a(I,J),[a(I,J)],_,_,9):- finish(I,J). %Должно быть открыто 9 дверей
перед тем как можно будет выйти
%Идём вверх
%Если двери нет и не были в данной клетке, то путь есть
way(a(I,J),[a(I,J)|P],Was,KolOpen,KolDoor):-
K = I-1,
not(wall(K,J)), %Если нет стены
K>=1, K<=10, %Проверка
not(member(a(K,J), Was)), %Если не были в данной комнате
KolOpen2=KolOpen+1, %Количество пройденных дверей
увеличиваем на 1
way(a(K,J),P,[a(K,J)|Was],KolOpen2,KolDoor). %Идём дальше
%Если есть дверь, не были в данной клетке и было пройдено 8
клеток ранее, то путь через стену есть
way(a(I,J),[a(I,J)|P],Was,8,KolDoor):-
K = I-1,
wall(K,J), %Если стена
not(member(a(K,J), Was)), %Если не были в данной комнате
KolOpen2=0, %Количество пройденных дверей обнуляем, т.к.
прошли через дверь
KolDoor2=KolDoor+1, %Количество открытых дверей увеличивается
way(a(K,J),P,[a(K,J)|Was],KolOpen2,KolDoor2). %Идём дальше
11
%Идём вниз
%Если двери нет и не были в данной клетке, то путь есть
way(a(I,J),[a(I,J)|P],Was,KolOpen,KolDoor) :-
K = I+1,
not(wall(K,J)), %Если нет стены
K>=1, K<=10, %Проверка
not(member(a(K,J), Was)), %Если не были в данной комнате
KolOpen2=KolOpen+1, %Количество пройденных дверей
увеличиваем на 1
way(a(K,J),P,[a(K,J)|Was],KolOpen2,KolDoor). %Идём дальше
%Если есть дверь, не были в данной клетке и было пройдено 8
клеток ранее, то путь через стену есть
way(a(I,J),[a(I,J)|P],Was,8,KolDoor) :-
K = I+1,
wall(K,J), %Если стена
not(member(a(K,J), Was)), %Если не были в данной комнате
KolOpen2=0, %Количество пройденных дверей обнуляем, т.к.
прошли через дверь
KolDoor2=KolDoor+1, %Количество открытых дверей увеличивается
way(a(K,J),P,[a(K,J)|Was],KolOpen2,KolDoor2). %Идём дальше
%Идём влево
%Если двери нет и не были в данной клетке, то путь есть
way(a(I,J),[a(I,J)|P],Was,KolOpen,KolDoor) :-
L = J-1,
not(wall(I,L)), %Если нет стены
L>=1, L<=10, %Проверка
not(member(a(I,L), Was)), %Если не были в данной комнате
KolOpen2=KolOpen+1, %Количество пройденных дверей
увеличиваем на 1
way(a(I,L),P,[a(I,L)|Was],KolOpen2,KolDoor). %Идём дальше
12
%Если есть дверь, не были в данной клетке и было пройдено 8
клеток ранее, то путь через стену
есть
way(a(I,J),[a(I,J)|P],Was,8,KolDoor) :-
L = J-1,
wall(I,L), %Если стена
not(member(a(I,L), Was)), %Если не были в данной комнате
KolOpen2=0, %Количество пройденных дверей обнуляем, т.к.
прошли через дверь
KolDoor2=KolDoor+1, %Количество открытых дверей увеличивается
way(a(I,L),P,[a(I,L)|Was],KolOpen2,KolDoor2). %Идём дальше
%Идём вправо
%Если двери нет и не были в данной клетке, то путь есть
way(a(I,J),[a(I,J)|P],Was,KolOpen,KolDoor) :-
L = J+1,
not(wall(I,L)), %Если нет стены
L>=1, L<=10, %Проверка
not(member(a(I,L), Was)), %Если не были в данной комнате
KolOpen2=KolOpen+1, %Количество пройденных дверей
увеличиваем на 1
way(a(I,L),P,[a(I,L)|Was],KolOpen2,KolDoor). %Идём дальше
%Если есть дверь, не были в данной клетке и было пройдено 8
клеток ранее, то путь через стену
есть
way(a(I,J),[a(I,J)|P],Was,8,KolDoor) :-
L = J+1,
wall(I,L), %Если стена
not(member(a(I,L), Was)), %Если не были в данной комнате
KolOpen2=0, %Количество пройденных дверей обнуляем, т.к.
прошли через дверь
KolDoor2=KolDoor+1, %Количество открытых дверей увеличивается
way(a(I,L),P,[a(I,L)|Was],KolOpen2,KolDoor2). %Идём дальше
13
%Проверяем были мы в данной клетке ранее или нет
member(I,[I|_]).
member(I,[_|P]):-member(I,P).
predicates
task_win_eh : EHANDLER
constants
%BEGIN Task Window, CreateParms, 20:14:02-11.3.2016, Code
automatically updated!
task_win_Flags =
[wsf_SizeBorder,wsf_TitleBar,wsf_Close,wsf_Maximize,wsf_Minimize,wsf_Clip
Siblings]
task_win_Menu = res_menu(idr_task_menu)
task_win_Title = "Lab1"
task_win_Help = idh_contents
%END Task Window, CreateParms
clauses
task_win_eh(_Win,e_Create(_),0):-!,
dlg_ввод_и_вывод_информации_Create (_Win),
win_Destroy (_Win),
!.
task_win_eh(_Win,e_Menu(id_help_contents,_ShiftCtlAlt),0):-!,
vpi_ShowHelp("lab1.hlp"),
!.
task_win_eh(Win,e_Menu(id_help_about,_ShiftCtlAlt),0):-!,
14
dlg_about_dialog_Create(Win),
!.
task_win_eh(Win,e_Menu(id_file_exit,_ShiftCtlAlt),0):-!,
win_Destroy(Win),
!.
task_win_eh(_Win,e_Size(_Width,_Height),0):-!,
ifdef use_tbar
toolbar_Resize(_Win),
enddef
ifdef use_message
msg_Resize(_Win),
enddef
!.
%END Task Window, e_Size
%END_WIN Task Window
project_ShowHelpContext(HelpTopic):-
vpi_ShowHelpContext("lab1.hlp",HelpTopic).
goal
ifdef use_mdi
vpi_SetAttrVal(attr_win_mdi,b_true),
enddef
ifdef ws_win
ifdef use_3dctrl
vpi_SetAttrVal(attr_win_3dcontrols,b_true),
enddef
enddef
15
vpi_Init(task_win_Flags,task_win_eh,task_win_Menu,"lab1",task_win_Title).
constants
%BEGIN About dialog, CreateParms, 20:14:02-11.3.2016, Code
automatically updated!
dlg_about_dialog_ResID = idd_dlg_about
dlg_about_dialog_DlgType = wd_Modal
dlg_about_dialog_Help = idh_contents
%END About dialog, CreateParms
predicates
dlg_about_dialog_eh : EHANDLER
clauses
dlg_about_dialog_Create(Parent):-
win_CreateResDialog(Parent,dlg_about_dialog_DlgType,dlg_about_dialog_ResID
,dlg_about_dial og_eh,0).
%BEGIN About dialog, idc_ok _CtlInfo
dlg_about_dialog_eh(_Win,e_Control(idc_ok,_CtrlType,_CtrlWin,_CtrlInfo),0):-!,
win_Destroy(_Win),
!.
%END About dialog, idc_ok _CtlInfo
%MARK About dialog, new events
dlg_about_dialog_eh(_,_,_):-!,fail.
constants
16
dlg_ввод_и_вывод_информации_ResID =
idd_ввод_и_вывод_информации
dlg_ввод_и_вывод_информации_DlgType = wd_Modal
dlg_ввод_и_вывод_информации_Help = idh_contents
predicates
dlg_ввод_и_вывод_информации_eh : EHANDLER
dlg_ввод_и_вывод_информации_handle_answer(INTEGER
EndButton,DIALOG_VAL_LIST)
dlg_ввод_и_вывод_информации_update(DIALOG_VAL_LIST)
clauses
dlg_ввод_и_вывод_информации_Create(Parent):-
%MARK Ввод и вывод информации, new variables
dialog_CreateModal(Parent,dlg_ввод_и_вывод_информации_ResID,"",
[
df(idc_текст1,editstr("",[]),nopr),
df(idc_текст3,editstr("",[]),nopr),
df(idc_текст5,editstr("",[]),nopr),
df(idc_текст7,editstr("",[]),nopr),
df(idc_текст9,editstr("",[]),nopr),
df(idc_текст11,editstr("",[]),nopr),
df(idc_текст13,editstr("",[]),nopr),
df(idc_текст15,editstr("",[]),nopr),
df(idc_текст16,editstr("",[]),nopr),
df(idc_текст14,editstr("",[]),nopr),
df(idc_текст12,editstr("",[]),nopr),
df(idc_текст10,editstr("",[]),nopr),
17
df(idc_текст8,editstr("",[]),nopr),
df(idc_текст6,editstr("",[]),nopr),
df(idc_текст4,editstr("",[]),nopr),
df(idc_текст2,editstr("",[]),nopr)
%END Ввод и вывод информации, ControlList
],
dlg_ввод_и_вывод_информации_eh,0,VALLIST,ANSWER),
dlg_ввод_и_вывод_информации_handle_answer(ANSWER,VALLIST).
dlg_ввод_и_вывод_информации_handle_answer(idc_ok,VALLIST):-!,
dlg_ввод_и_вывод_информации_update(VALLIST).
dlg_ввод_и_вывод_информации_handle_answer(idc_cancel,_):-!. %
Handle Esc and Cancel here
dlg_ввод_и_вывод_информации_handle_answer(_,_):-
errorexit().
dlg_ввод_и_вывод_информации_update(_VALLIST):-
%BEGIN Ввод и вывод информации, Update controls, 20:50:02-3.6.2016,
Code automatically updated!
_IDC_ТЕКСТ1_VALUE = dialog_VLGetstr(idc_текст1,_VALLIST),
_IDC_ТЕКСТ3_VALUE = dialog_VLGetstr(idc_текст3,_VALLIST),
_IDC_ТЕКСТ5_VALUE = dialog_VLGetstr(idc_текст5,_VALLIST),
_IDC_ТЕКСТ7_VALUE = dialog_VLGetstr(idc_текст7,_VALLIST),
_IDC_ТЕКСТ9_VALUE = dialog_VLGetstr(idc_текст9,_VALLIST),
_IDC_ТЕКСТ11_VALUE = dialog_VLGetstr(idc_текст11,_VALLIST),
_IDC_ТЕКСТ13_VALUE = dialog_VLGetstr(idc_текст13,_VALLIST),
_IDC_ТЕКСТ15_VALUE = dialog_VLGetstr(idc_текст15,_VALLIST),
_IDC_ТЕКСТ16_VALUE = dialog_VLGetstr(idc_текст16,_VALLIST),
_IDC_ТЕКСТ17_VALUE = dialog_VLGetstr(idc_текст17,_VALLIST),
_IDC_ТЕКСТ18_VALUE = dialog_VLGetstr(idc_текст18,_VALLIST),
_IDC_ТЕКСТ14_VALUE = dialog_VLGetstr(idc_текст14,_VALLIST),
_IDC_ТЕКСТ12_VALUE = dialog_VLGetstr(idc_текст12,_VALLIST),
18
_IDC_ТЕКСТ10_VALUE = dialog_VLGetstr(idc_текст10,_VALLIST),
_IDC_ТЕКСТ8_VALUE = dialog_VLGetstr(idc_текст8,_VALLIST),
_IDC_ТЕКСТ6_VALUE = dialog_VLGetstr(idc_текст6,_VALLIST),
_IDC_ТЕКСТ4_VALUE = dialog_VLGetstr(idc_текст4,_VALLIST),
_IDC_ТЕКСТ2_VALUE = dialog_VLGetstr(idc_текст2,_VALLIST),
%END Ввод и вывод информации, Updatecontrols
true.
%MARK Ввод и вывод информации, newevents
%BEGIN Ввод и вывод информации, idc_ввод _CtlInfo
dlg_ввод_и_вывод_информации_eh(_Win,e_Control(idc_ввод,_CtrlType,
_CtrlWin,_CtlInfo),0):-
%Вывод картинки
Picture = pict_GetFromRes (idb_s),
pict_Draw(_Win,Picture,pnt(20,20),rop_SrcCopy),
Текст1 = win_GetCtlHandle (_Win,idc_текст1), Текст2 =
win_GetCtlHandle (_Win,idc_текст2),
Текст3 = win_GetCtlHandle (_Win,idc_текст3), Текст4 =
win_GetCtlHandle (_Win,idc_текст4),
Текст5 = win_GetCtlHandle (_Win,idc_текст5), Текст6 =
win_GetCtlHandle (_Win,idc_текст6),
Текст7 = win_GetCtlHandle (_Win,idc_текст7), Текст8 =
win_GetCtlHandle (_Win,idc_текст8),
Текст9 = win_GetCtlHandle (_Win,idc_текст9), Текст10 =
win_GetCtlHandle (_Win,idc_текст10),
Текст11 = win_GetCtlHandle (_Win,idc_текст11), Текст12 =
win_GetCtlHandle (_Win,idc_текст12),
Текст13 = win_GetCtlHandle (_Win,idc_текст13), Текст14 =
win_GetCtlHandle (_Win,idc_текст14),
Текст15 = win_GetCtlHandle (_Win,idc_текст15), Текст16 =
win_GetCtlHandle (_Win,idc_текст16),
19
Текст17 = win_GetCtlHandle (_Win,idc_текст17), Текст18 =
win_GetCtlHandle (_Win,idc_текст18),
ТекстНовый1 = win_GetText (Текст1), ТекстНовый2 = win_GetText
(Текст2),
ТекстНовый3 = win_GetText (Текст3), ТекстНовый4 = win_GetText
(Текст4),
ТекстНовый5 = win_GetText (Текст5), ТекстНовый6 = win_GetText
(Текст6),
ТекстНовый7 = win_GetText (Текст7), ТекстНовый8 = win_GetText
(Текст8),
ТекстНовый9 = win_GetText (Текст9), ТекстНовый10 = win_GetText
(Текст10),
ТекстНовый11 = win_GetText (Текст11), ТекстНовый12 =
win_GetText (Текст12),
ТекстНовый13 = win_GetText (Текст13), ТекстНовый14 =
win_GetText (Текст14),
ТекстНовый15 = win_GetText (Текст15), ТекстНовый16 =
win_GetText (Текст16),
ТекстНовый17 = win_GetText (Текст17), ТекстНовый18 =
win_GetText (Текст18),
ТекстНовый1 <> "", ТекстНовый2 <> "", ТекстНовый3 <> "",
ТекстНовый4 <>
"",
ТекстНовый5 <> "", ТекстНовый6 <> "", ТекстНовый7 <> "",
ТекстНовый8 <>
"",
ТекстНовый9 <> "", ТекстНовый10 <> "", ТекстНовый11 <> "",
ТекстНовый12 <>
"",
ТекстНовый13 <> "", ТекстНовый14 <> "", ТекстНовый15 <> "",
ТекстНовый16 <>
"",
ТекстНовый17 <> "", ТекстНовый18 <> "",
%ПРОВЕРКИ НА ТО ЧТОБЫ БЫЛИ ВВЕДЕНЫ РАЗНЫЕ
НАЧАЛЬНЫЕ ГРАНИЦЫ
str_int(ТекстНовый1,Число1), str_int(ТекстНовый2,Число2),
str_int(ТекстНовый3,Число3), str_int(ТекстНовый4,Число4),
str_int(ТекстНовый5,Число5), str_int(ТекстНовый6,Число6),
str_int(ТекстНовый7,Число7), str_int(ТекстНовый8,Число8),
str_int(ТекстНовый9,Число9), str_int(ТекстНовый10,Число10),
str_int(ТекстНовый11,Число11), str_int(ТекстНовый12,Число12),
str_int(ТекстНовый13,Число13), str_int(ТекстНовый14,Число14),
str_int(ТекстНовый15,Число15), str_int(ТекстНовый16,Число16),
20
str_int(ТекстНовый17,Число17), str_int(ТекстНовый18,Число18),
Число1>=1,Число1<=10,Число2>=1,Число2<=10,Число3>=1,Число3<=10,Чис
ло4>=1,Число4
<=10,
Число5>=1,Число5<=10,Число6>=1,Число6<=10,Число7>=1,Число7<=10,Чис
ло8>=1,Число8
<=10,
Число9>=1,Число9<=10,Число10>=1,Число10<=10,Число11>=1,Число11<=10
,Число12>=1, Число12<=10,
Число13>=1,Число13<=10,Число14>=1,Число14<=10,Число15>=1,Число15<=
10,Число16>= 1,Число16<=10,
квадрат(_Win,Число1,Число2),
квадрат(_Win,Число3,Число4),
квадрат(_Win,Число5,Число6),
квадрат(_Win,Число7,Число8),
квадрат(_Win,Число9,Число10),
квадрат(_Win,Число11,Число12),
квадрат(_Win,Число13,Число14),
квадрат(_Win,Число15,Число16),
квадрат(_Win,Число17,Число18),
retractall(wall(_,_)),
assert(wall(Число1,Число2)),
assert(wall(Число3,Число4)),
assert(wall(Число5,Число6)),
assert(wall(Число7,Число8)),
assert(wall(Число9,Число10)),
assert(wall(Число11,Число12)),
assert(wall(Число13,Число14)),
assert(wall(Число15,Число16)),
21
assert(wall(Число17,Число18)),
all(P), !,
цифры(_Win,P,0),
!.
dlg_ввод_и_вывод_информации_eh(_Win,e_Control(idc_ввод,_CtrlType,_Ctrl
Win,_CtlInfo),0):-!,
dlg_note ("Некорректный ввод данных или путь не найден!"),
!.
dlg_ввод_и_вывод_информации_eh(_,_,_):-!,fail.
%ВЫВОД КВАДРАТА
квадрат (_Win,XX,YY):-
win_SetBrush(_Win,brush(pat_Solid,color_Black)),
%draw_Rect (_Win, rct(60,55,110,105)),
X=XX-1,
X1=X*50,
X11=X1+58,
X22=X1+108,
Y=YY-1,
Y1=Y*50,
Y11=Y1+52,
Y22=Y1+103,
draw_Rect (_Win, rct(Y11,X11,Y22,X22)),!.
цифры(_Win,[],N).
цифры(_Win,[a(XX,YY)|P],N):-
X=XX-1,
X1=X*49,
X11=X1+73,
Y=YY-1,
Y1=Y*49,
Y11=Y1+68,
N1=N+1,
str_int(Text,N1),
draw_Text(_Win, Y11, X11, Text),
%вывод в листбокс
HandleListBox = win_GetCtlHandle (_Win,idc_lb),
str_int(I1,XX),
str_int(J1,YY),
concat("Координата: (", I1, String0),
concat(String0, ",", String2),
concat(String2, J1, String3),
concat(String3, ")", String4),
Len = lbox_CountAll(HandleListBox),%Длина
lbox_add(HandleListBox, Len, String4),
цифры(_Win,P,N1),!