Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.11.2011, 19:30   #1
ankatito
 
Регистрация: 02.03.2010
Сообщений: 6
По умолчанию Prolog

Кусок из программы лабиринт
при нажатии "1" нужно нарисовать лабиринт размером 13на 13, но он выводит только 4,5 строки. в чем ошибка, подскажите?
trace
domains
m=a*
a=a(i,j)
j=integer
i=integer

predicates

wall(i,j)
no_wall(i,j)
finish(i,j)
writemaze(i,j)
menu
do(char)
clauses
wall(1,1). %We draw a walls of column 1.
wall(3,1).
wall(4,1).
wall(5,1).
wall(6,1).
wall(7,1).
wall(8,1).
wall(9,1).
wall(10,1).
wall(11,1).
wall(12,1).
wall(13,1).
wall(1,2). %We draw a walls of column 2.
wall(7,2).
wall(11,2).
wall(13,2).
wall(1,3). %We draw a walls of column 3.
wall(2,3).
wall(3,3).
wall(5,3).
wall(6,3).
wall(7,3).
wall(8,3).
wall(9,3).
wall(11,3).
wall(13,3).
wall(1,4). %We draw a walls of column 4.
wall(3,4).
wall(5,4).
wall(13,4).
wall(1,5).
wall(7,5). %We draw a walls of column 5.
wall(8,5).
wall(9,5).
wall(11,5).
wall(12,5).
wall(13,5).
wall(1,6). %We draw a walls of column 6.
wall(2,6).
wall(4,6).
wall(5,6).
wall(9,6).
wall(13,6).
wall(1,7). %We draw a walls of column 7.
wall(4,7).
wall(5,7).
wall(11,7).
wall(12,7).
wall(13,7).
wall(1,8). %We draw a walls of column 8.
wall(3,8).
wall(4,8).
wall(7,8).
wall(8,8).
wall(9,8).
wall(11,8).
wall(13,8).
wall(1,9). %We draw a walls of column 9.
wall(5,9).
wall(13,9).
wall(1,10). %We draw a walls of column 10.
wall(3,10).
wall(4,10).
wall(7,10).
wall(9,10).
wall(11,10).
wall(12,10).
wall(13,10).
wall(1,11). %We draw a walls of column 11.
wall(5,11).
wall(6,11).
wall(7,11).
wall(8,11).
wall(9,11).
wall(12,11).
wall(13,11).
wall(1,12). %We draw a walls of column 12.
wall(3,12).
wall(9,12).
wall(10,12).
wall(13,12).
wall(1,13). %We draw a walls of column 13.
wall(2,13).
wall(3,13).
wall(4,13).
wall(5,13).
wall(6,13).
wall(7,13).
wall(8,13).
wall(9,13).
wall(10,13).
wall(11,13).
wall(12,13).
wall(13,13).

no_wall(2,1). %We draw a path of column 1.
no_wall(2,2). %We draw a path of column 2.
no_wall(3,2).
no_wall(4,2).
no_wall(5,2).
no_wall(6,2).
no_wall(8,2).
no_wall(9,2).
no_wall(10,2).
no_wall(12,2).
no_wall(4,3). %We draw a path of column 3.
no_wall(10,3).
no_wall(12,3).
no_wall(2,4). %We draw a path of column 4.
no_wall(4,4).
no_wall(6,4).
no_wall(7,4).
no_wall(8,4).
no_wall(9,4).
no_wall(10,4).
no_wall(11,4).
no_wall(12,4).
no_wall(2,5).
no_wall(3,5). %We draw a path of column 5.
no_wall(4,5).
no_wall(5,5).
no_wall(6,5).
no_wall(10,5).
no_wall(3,6). %%We draw a path of column 6.
no_wall(6,6).
no_wall(7,6).
no_wall(8,6).
no_wall(10,6).
no_wall(11,6).
no_wall(12,6).
no_wall(2,7). %We draw a path of column 7.
no_wall(3,7).
no_wall(5,7).
no_wall(6,7).
no_wall(8,7).
no_wall(9,7).
no_wall(10,7).
no_wall(2,8). %We draw a path of column 8.
no_wall(6,8).
no_wall(10,8).
no_wall(12,8).
no_wall(2,9). %We draw a path of column 9.
no_wall(3,9).
no_wall(4,9).
no_wall(6,9).
no_wall(7,9).
no_wall(8,9).
no_wall(9,9).
no_wall(10,9).
no_wall(11,9).
no_wall(12,9).
no_wall(2,10). %We draw a path of column 10.
no_wall(5,10).
no_wall(6,10).
no_wall(8,10).
no_wall(10,10).
no_wall(2,11). %%We draw a path of column 11.
no_wall(3,11).
no_wall(4,11).
no_wall(10,11).
no_wall(11,11).
no_wall(2,12). %We draw a path of column 12.
no_wall(4,12).
no_wall(5,12).
no_wall(6,12).
no_wall(7,12).
no_wall(8,12).
no_wall(11,12).
no_wall(12,12).
no_wall(12,13). %We draw a path of column 13.
finish(12,13).


menu:-write("1 To draw a labyrinth."),nl,

nl,nl,
readchar(N),do(N),N='0'.

do('1'):-writemaze(1,1),nl.


do('0').

writemaze(13,14):-nl.
writemaze(N,14):-B=N+1,nl,writemaze(B,1).
writemaze(N,M):-wall(N,M),write("*"),K=M+1,writemaz e(N,K);
no_wall(N,M),write("+"),K=M+1,write maze(N,K).

goal
menu.
Вложения
Тип файла: rar 32.rar (973 байт, 5 просмотров)
Я не поняла вашего вопроса, но я вам на него отвечу
ISQ 456791898
http://vkontakte.ru/id8698421
ankatito вне форума Ответить с цитированием
Старый 13.11.2011, 19:49   #2
ankatito
 
Регистрация: 02.03.2010
Сообщений: 6
По умолчанию

выводит получается только 50 символов, как сделать так, чтобы выводились 119 символов?
Я не поняла вашего вопроса, но я вам на него отвечу
ISQ 456791898
http://vkontakte.ru/id8698421
ankatito вне форума Ответить с цитированием
Старый 13.11.2011, 20:27   #3
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

все очень просто. Смотрим вся логика программы заключена тут:
Код:
writemaze(13,14):-nl.
writemaze(N,14):-B=N+1,nl,writemaze(B,1).
writemaze(N,M):-wall(N,M),write("*"),K=M+1,writemaz e(N,K);
no_wall(N,M),write("+"),K=M+1,write maze(N,K).
первая строчка нужна чтобы остановить отрисовку лабиринта на 13 строке и 14 символе
вторая строчка чтобы начать отрисовку новой строки после вывода 14 символа текущей строки.
во всех остальных случаях выполняет следующее
Код:
1. если в текущей клетке есть стена(ищем в БД) - то выводим звездочку и переходим к выводу следующего символа(рекурсивно)
2. если предыдущий пункт ложен(в БД нет записи о том что во соответствующей клетке должна быть стена) - то проверяем "если в текущей клетке НЕ стена"(тоже ищем в БД) - то выводим плюсик и рекурсивно переходим к следующему символу.
очень просто, но очевидно что если в БД нет записи о том ЧТО должно быть в текущей клетке - то правило завершится неудачей. Вот поэтому у вас программа и завершается досрочно.

Вообще ИМХО весьма криво построена программа. Логично что если в клетке ничего нет - то она пуста. Зачем заносить все пустые клетки в БД?
no_wal надо удалить вообще.

Кроме того, стоит нормально отформатировать код - расставить отступы. Раздел goal лучше помещать сразу после predicates - так легче его найти, а ведь именно с него начинает работать программа. Записи БД(о стенах, в вашем случае) надо поместить в самый конец, а лучше в отдельный файл.
rrrFer вне форума Ответить с цитированием
Старый 13.11.2011, 20:32   #4
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

еще надо было в районе правила do
добавить отсечение.
Вот, примите в дар код:
Код:
predicates
	wall(integer,integer)
	writemaze(integer,integer)
	menu
	do(char)
goal
	menu. 
clauses
	menu:-
		write("1 To draw a labyrinth."),nl,nl,nl,
		readchar(N),do(N),N='0'.
	do('1'):-
		writemaze(1,1),!,nl.
	do('0').

	writemaze(13,14):-nl.
	writemaze(N,14):-
		B=N+1,nl,writemaze(B,1).
	writemaze(N,M):-
		wall(N,M),write("*"),
		K=M+1,writemaze(N,K);		%!
		write("+"),
		K=M+1,writemaze(N,K).		

	wall(1,1). %We draw a walls of column 1.
	wall(3,1).
	wall(4,1).
	wall(5,1).
	wall(6,1).
	wall(7,1).
	wall(8,1).
	wall(9,1).
	wall(10,1).
	wall(11,1).
	wall(12,1).
	wall(13,1).
	wall(1,2). %We draw a walls of column 2.
	wall(7,2).
	wall(11,2).
	wall(13,2).
	wall(1,3). %We draw a walls of column 3.
	wall(2,3).
	wall(3,3).
	wall(5,3).
	wall(6,3).
	wall(7,3).
	wall(8,3).
	wall(9,3).
	wall(11,3).
	wall(13,3).
	wall(1,4). %We draw a walls of column 4.
	wall(3,4).
	wall(5,4).
	wall(13,4).
	wall(1,5).
	wall(7,5). %We draw a walls of column 5.
	wall(8,5).
	wall(9,5).
	wall(11,5).
	wall(12,5).
	wall(13,5).
	wall(1,6). %We draw a walls of column 6.
	wall(2,6).
	wall(4,6).
	wall(5,6).
	wall(9,6).
	wall(13,6).
	wall(1,7). %We draw a walls of column 7.
	wall(4,7).
	wall(5,7).
	wall(11,7).
	wall(12,7).
	wall(13,7).
	wall(1,8). %We draw a walls of column 8.
	wall(3,8).
	wall(4,8).
	wall(7,8).
	wall(8,8).
	wall(9,8).
	wall(11,8).
	wall(13,8).
	wall(1,9). %We draw a walls of column 9.
	wall(5,9).
	wall(13,9).
	wall(1,10). %We draw a walls of column 10.
	wall(3,10).
	wall(4,10).
	wall(7,10).
	wall(9,10).
	wall(11,10).
	wall(12,10).
	wall(13,10).
	wall(1,11). %We draw a walls of column 11.
	wall(5,11).
	wall(6,11).
	wall(7,11).
	wall(8,11).
	wall(9,11).
	wall(12,11).
	wall(13,11).
	wall(1,12). %We draw a walls of column 12.
	wall(3,12).
	wall(9,12).
	wall(10,12).
	wall(13,12).
	wall(1,13). %We draw a walls of column 13.
	wall(2,13).
	wall(3,13).
	wall(4,13).
	wall(5,13).
	wall(6,13).
	wall(7,13).
	wall(8,13).
	wall(9,13).
	wall(10,13).
	wall(11,13).
	wall(12,13).
	wall(13,13).

Последний раз редактировалось rrrFer; 13.11.2011 в 20:42.
rrrFer вне форума Ответить с цитированием
Старый 13.11.2011, 20:39   #5
ankatito
 
Регистрация: 02.03.2010
Сообщений: 6
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
очень просто, но очевидно что если в БД нет записи о том ЧТО должно быть в текущей клетке - то правило завершится неудачей. Вот поэтому у вас программа и завершается досрочно.
как так получается, что о первых 50 символах информация есть в БД, а об остальных нет. где нужно исправить?

За остальные советы огромное спасибо, исправлю.
Я не поняла вашего вопроса, но я вам на него отвечу
ISQ 456791898
http://vkontakte.ru/id8698421
ankatito вне форума Ответить с цитированием
Старый 13.11.2011, 20:44   #6
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
как так получается, что о первых 50 символах информация есть в БД, а об остальных нет. где нужно исправить?
да, ну можно было править БД. Для этого нудно было рассчитать номер строки и столбца(пятидесятый символ) информации о котором нет в БД и добавить эту информацию )
Но лучше всеже не хранить информацию о "нестенах". Почему? - писал выше.
rrrFer вне форума Ответить с цитированием
Старый 13.11.2011, 20:53   #7
ankatito
 
Регистрация: 02.03.2010
Сообщений: 6
По умолчанию

Благодарю))) Очень выручили)))
Я не поняла вашего вопроса, но я вам на него отвечу
ISQ 456791898
http://vkontakte.ru/id8698421
ankatito вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
prolog Studento4ka Помощь студентам 0 18.04.2010 11:17
Prolog Darck Angel Софт 0 17.01.2010 20:32
Prolog @Katushka@ Помощь студентам 0 03.10.2009 22:44
Prolog Zeraim Общие вопросы Delphi 1 14.05.2008 18:01
Prolog 301 Помощь студентам 10 27.03.2008 20:43