[Закрыть]
 
popoff.donetsk.ua
Глаз способен видеть все что угодно, кроме себя. Для того чтобы увидеть себя, ему нужна зеркальная поверхность.
Начало | Новости | Статьи | Форум | Опросы | Карта сайта | Обо мне
popoff.donetsk.ua - Форум - Функциональное и логическое программирование - Рекурсия - незадачка

Рекурсия - незадачка

форумы popoff.donetsk.ua
Страницы: [1]
<< Новый  |  Старый >>  |  Ответ не возможен

Внимание! Этот топик устарел. Пожалуйста, создайте новый топик, чтобы задать интересующий Вас вопрос.

Автор Сообщение
3dbaron
kalven
Апр, 2009
Сообщений: 1
3dbaron url://forum.message:2785
Рекурсия - незадачка

Вообщем такая вот задачка. проблема с X, пролог пишет что Free variable in expression. Говорил сегодня с преподом, показал как примерно сделать, и вот что вышло. Задача думаю простая, но не для меня. Мне надо вводить числа, и выводить с таким условием:выводим первое, а каждое след > пред. Здесь Nи count не обращаите внимание(Это потом для счетчика и т.д.) . у меня же тут проблема, что я не понимаю как первое число сделать для того чтобы от него уже сравнивать с дольнейшими числама, для вывода, и еще потом присваивать новое значение. тут  как бы с рекурсией двоной, т.е. в первом случае Х наибольший, по нему сравнивается, если вдруг число появилось больше чем Х , то уже по второй рекурсиий сравнивается,потом наоборот(фуухх, главное чтобы не запутать Вас)Вообщем описал примерно что я тут «накодил» ... Буду признателен любой помощи.

domains
N,X,Count = integer
predicates
vvod(N,X,Count)
vvod2(N,X,Count)
check(integer)
goal
vvod(N,X,Count),!,
vvod2(N,Y,Count).
clauses
vvod(N,X,Count):-
write(Vvedite 4islo),
readint(Y),
Y>X,X=Y,
write(max Y=,Y),nl,
check(Y),
vvod(N,X,Count).
vvod2(N,Y,Count):-
readint(X),
X>Y,Y=X,
write(max X=,X),
vvod(N,Y,Count).
check(0):-nl,write(konec raboti).
check(_):-fail.

popoff
Yuri
Июл, 2004
Сообщений: 929
popoff url://forum.message:2788

проблема с “X”, пролог пишет что “Free variable in expression”.

3dbaronфорумы popoff.donetsk.ua

Эта ошибка означает, что у Вас в выражении используется неконкретизированная переменная и Пролог не может эту переменную конкретизировать.

Например, если задать к такой программе:
predicate(_).
такой запрос:
?-predicate(X).
то возникнет эта ошибка, так как в Вашем запросе Вы хотите узнать, при каких значениях предикат истинен, но в программе записано, что предикат истинен при любых значениях. То есть, Пролог не может сказать, при каких именно значениях предикат будет истинен и, поэтому, выдаст такую ошибку.

Вот ещё подобный случай. Если задать к такой программе:
greater(X,Y):-X>Y.
такой запрос:
greater(1,X).
то Пролог тоже выдаст эту ошибку, так как Пролог не может найти какие-нибудь конкретные значения, которые были бы меньше 1.


Дополнительно, судя по всему, Вы ещё не знаете, что в Прологе совершенно полностью отсутствует всякое присваивание - там только сравнение.
Это просто оператор сравнения работает так, что если одна из переменных неконкретизирована, то Пролог её конкретизирует значением второй переменной и говорит, что переменные равны.
Если же обе переменные уже конкретизированы, то Пролог ничего не меняет - он только сравнивает.

Например, такая программа:
plus(X):-X=X+1.
может выдать только два возможных результата - ложь (если переменная Х равна какому угодно значению) и ошибка, если Х неконкретизирована.

________________________________
Если не будет деревьев — нам нечем будет дышать, если вода загрязнится — нам нечего будет пить.

Внимание! Этот топик устарел. Пожалуйста, создайте новый топик, чтобы задать интересующий Вас вопрос.

Страницы: [1]
<< Новый  |  Старый >>  |  Ответ не возможен
Вход
Поиск[?]:
Программное обеспечение любой сложности
koins.com.ua