1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
| 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)
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). %Идём дальше
%Идём вниз
%Если двери нет и не были в данной клетке, то путь есть
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). %Идём дальше
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). %Идём дальше
%Проверяем были мы в данной клетке ранее или нет
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):-!,
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
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
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),
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):-
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),
_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),
Текст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),
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)),
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),! |