Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Присваивание переменных в прологе 
V
    Опции темы
Big_Maks
Дата 14.5.2007, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 27.9.2006

Репутация: нет
Всего: нет



Есть такая проблемма. Имеется ли возможность в прологе сказать чтобы выражение S2=S1(при том что обе переменные были инициализированы ранее) он воспринимал не как сравнение, а как присвоение значение S1 переменной S2. Мне такая штука нужна в цикле, поскольку в цикле изменять имена переменных возможности не представляет. 
Вся проблемма по сути сводится к необходимости обнулить переменную S2. 
У кого какие идеи?

Добавлено через 3 минуты и 30 секунд
Для уточнения. По задаче переменные это список типа integer

Добавлено через 9 минут и 54 секунды
используется Visual Prolog 5.1
PM MAIL   Вверх
Artemios
Дата 14.5.2007, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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) ]
PM MAIL   Вверх
Big_Maks
Дата 14.5.2007, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 27.9.2006

Репутация: нет
Всего: нет



мне тут поведали что конструкция предиката следующего типа:
.........,
!,
тело ццикла,
условие,
nl,
цикл кончился

является циклом
и будет выполняться до тех пор пока не выполнится условие.
Я проверял вещица действительно циклится. Только если неоходимость повторного присвоения переменных, то вылетает поскольку конечно сравнение возвращает false. 
PM MAIL   Вверх
Artemios
Дата 15.5.2007, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 6
Всего: 50



Цитата

.........,
!,
тело ццикла,
условие,
nl,
цикл кончился

Вас ввели в заблуждение, это не цикл. Здесь мнимая "повторяемость" связана с тем, как пролог-система ищет ответ на поставленную цель. Если очередная под-цель получилась ложной (неуспешной), происходит откат к предыдущей под-цели (с деинициализацией инициализированных на данном шаге переменных) и продолжаются попытки унификации по другим возможным сопоставлениям (если еще возможны иные сопоставления). А отсечение (восклицательный знак !) запрещает производить откат к более ранним под-целям. В вашем случае так и получается: отсечение->тело "цикла"->условие - условие ложное->откат до отсечения и повтор. Циклом это не является потому, что нет возможности сохранения данных из тех целей, которые привели к неуспеху. Неуспешные цели считаются "аки не бывшие", и единственная некрасивая возможность сохранения из них данных -- использование "побочных явлений", как например write или assert.

Смысл заключается в том, что в языках декларативного программирования (в т.ч. и в Прологе) явно не описывают последовательности действий, соответственно не существует ни переменных в обычном их понимании, ни алгоритмических конструкций типа цикла. Вместо последовательности действий в Прологе описываются логические взаимосвязи для компонентов решаемой задачи.
А если задача имеет итеративный характер (для которого в обыкновенных языках используются циклы), то в Прологе для таких задач используют рекурсивные зависимости. Например, как я понял, вам нужна работа со списком. Это можно было б сделать например так:

предикат([]).  % это базис рекурсии, говорящий, что на пустом списке мы останавливаемся
предикат([ Голова | Хвост ]):-   % далее описываем взаимосвязи для списка с первым элементом Голова
    другие_предикаты,
    предикат(Хвост).              % а это шаг рекурсии, повторяющий те же зависимости для хвоста.



--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума Prolog
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Prolog | Следующая тема »


 




[ Время генерации скрипта: 0.0896 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.