![]() |
|
|
![]()
|
|
| Big_Maks |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 27.9.2006 Репутация: нет Всего: нет |
Есть такая проблемма. Имеется ли возможность в прологе сказать чтобы выражение S2=S1(при том что обе переменные были инициализированы ранее) он воспринимал не как сравнение, а как присвоение значение S1 переменной S2. Мне такая штука нужна в цикле, поскольку в цикле изменять имена переменных возможности не представляет.
Вся проблемма по сути сводится к необходимости обнулить переменную S2. У кого какие идеи? Добавлено через 3 минуты и 30 секунд Для уточнения. По задаче переменные это список типа integer Добавлено через 9 минут и 54 секунды используется Visual Prolog 5.1 |
|||
|
||||
| Artemios |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 6 Всего: 50 |
Как конкретно в Visual не знаю, а вообще в Прологе не существует переменных в общепринятом их понимании.
Есть инициализированные значением переменные, а есть еще не инициализированные. Так вот, инициализированная некоторым значением переменная повторно инициализироваться иным значением уже не может. Если происходит унификация S1=S2, где S1 еще не инициализирована, а S2 уже инициализирована, то S1 инициализируется тем же значением, то есть происходит некое "присваивание" (также и наоборот, если S1 инициализирована, а S2 - нет - то S2 инициализируется). А если уже обе переменные инициализированы некоторыми значениями, то процесса унификации (с означиванием переменных) здесь уже происходить не может - происходит лишь вычисление значения предиката (в данном случае сравнение двух значений). А вообще странно, какие могут быть в Прологе циклы? -------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
|||
|
||||
| Big_Maks |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 27.9.2006 Репутация: нет Всего: нет |
мне тут поведали что конструкция предиката следующего типа:
........., !, тело ццикла, условие, nl, цикл кончился является циклом и будет выполняться до тех пор пока не выполнится условие. Я проверял вещица действительно циклится. Только если неоходимость повторного присвоения переменных, то вылетает поскольку конечно сравнение возвращает false. |
|||
|
||||
| Artemios |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 6 Всего: 50 |
Вас ввели в заблуждение, это не цикл. Здесь мнимая "повторяемость" связана с тем, как пролог-система ищет ответ на поставленную цель. Если очередная под-цель получилась ложной (неуспешной), происходит откат к предыдущей под-цели (с деинициализацией инициализированных на данном шаге переменных) и продолжаются попытки унификации по другим возможным сопоставлениям (если еще возможны иные сопоставления). А отсечение (восклицательный знак !) запрещает производить откат к более ранним под-целям. В вашем случае так и получается: отсечение->тело "цикла"->условие - условие ложное->откат до отсечения и повтор. Циклом это не является потому, что нет возможности сохранения данных из тех целей, которые привели к неуспеху. Неуспешные цели считаются "аки не бывшие", и единственная некрасивая возможность сохранения из них данных -- использование "побочных явлений", как например write или assert. Смысл заключается в том, что в языках декларативного программирования (в т.ч. и в Прологе) явно не описывают последовательности действий, соответственно не существует ни переменных в обычном их понимании, ни алгоритмических конструкций типа цикла. Вместо последовательности действий в Прологе описываются логические взаимосвязи для компонентов решаемой задачи. А если задача имеет итеративный характер (для которого в обыкновенных языках используются циклы), то в Прологе для таких задач используют рекурсивные зависимости. Например, как я понял, вам нужна работа со списком. Это можно было б сделать например так: предикат([]). % это базис рекурсии, говорящий, что на пустом списке мы останавливаемся предикат([ Голова | Хвост ]):- % далее описываем взаимосвязи для списка с первым элементом Голова другие_предикаты, предикат(Хвост). % а это шаг рекурсии, повторяющий те же зависимости для хвоста. -------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
|||
|
||||
![]()
|
| Правила форума Prolog | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Prolog | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |