Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема инициализации аргумента 
V
    Опции темы
Ak47black
  Дата 19.9.2010, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

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



Здравствуйте.
Пытаюсь сделать предикат который берёт: список целых чисел, переменную. И возвращает число записанное в списке как переменную.
Тоесть другими словами например
Цитата

deс([1,9,8,5], cisl).
    cisl = 1985.

Вот так пытаюсь сделать
Код

deс([X|[]], cisl):- cisl is cisl+X.
deс([X|[Y|Z]], cisl):- length([Y|Z], M), cisl is cisl+(10*(M+1))*X, deс([Y|Z], cisl).

Но получаю ошибку
Цитата

ERROR: is/2: Arguments are not sufficiently instantiated

PM MAIL   Вверх
Ak47black
Дата 19.9.2010, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

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



Пришел вот к такому коду,
Код

vozv(0, _).
vozv(X, Z):- X is X-1, vozv(X, Z)*10.
dec([X|[]], Cisl):- Cisl is X.
dec([X|[Y|Z]], Cisl):- length([Y|Z], M), M is M+1, vozv(M, A), dec([Y|Z], Cisl2), Cisl is Cisl2+A*X.

Но почему-то в ответе я получаю вместо переменной
Цитата

false

Как быть? И почему так?

Это сообщение отредактировал(а) Ak47black - 19.9.2010, 18:23
PM MAIL   Вверх
Фантом
Дата 19.9.2010, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


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

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



Цитата(Ak47black @  19.9.2010,  18:21 Найти цитируемый пост)
X is X-1

Цитата(Ak47black @  19.9.2010,  18:21 Найти цитируемый пост)
M is M+1

Я уже Вам сегодня писал - в языке Пролог нет оператора присваивания. Обе процитированные конструкции вернут false вне зависимости от чего-либо другого. 

PM   Вверх
Ak47black
Дата 19.9.2010, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

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



А тогда сделать, что запрос и ответ выглядел так
Цитата

deс([1,9,8,5], Cisl).
    Cisl = 1985.

?

Добавлено через 6 минут и 19 секунд
Знаете, я не уверен, но может я плохо само условие задачи понял.
Такое вообще в принципе возможно, что в ответе можно получить переменную?
PM MAIL   Вверх
Фантом
Дата 19.9.2010, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


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

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



Цитата(Ak47black @  19.9.2010,  19:27 Найти цитируемый пост)
Такое вообще в принципе возможно, что в ответе можно получить переменную? 

Возможно, но переменная изначально не должна быть инициализирована.

Ваша задача решается, например, так:

Код

ln([],R,R).

ln([H|T],Z,R):-Zz is 10*Z+H,ln(T,Zz,R).


Вызов, соответственно, ln([1,9,8,5],0,Result). Если лишний нуль в вызове не нравится, можно приделать "оболочку":
Код

dec(L,R):-ln(L,0,R).

PM   Вверх
Ak47black
Дата 19.9.2010, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

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



Для меня вот это код ещё непонятен, если Вы его прокомментируете, то было-бы интересно узнать как он работает   smile 
Код

ln([],R,R).

А вообще спасибо, за доходчивые объяснения

Это сообщение отредактировал(а) Ak47black - 19.9.2010, 20:28
PM MAIL   Вверх
Фантом
Дата 19.9.2010, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


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

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



Цитата(Ak47black @  19.9.2010,  19:41 Найти цитируемый пост)
Для меня вот это код ещё непонятен, если Вы его прокомментируете, то было-бы интересно узнать как он работает 

Все просто. Предполагается, что первый и второй параметры этого предиката при его вызове определены, а третий - нет (и он фактически является чем-то вроде возращаемого параметра процедуры). Соответственно, первая альтернатива имеет такой смысл: если список в первом параметре пуст, то значение третьего параметра становится равным значению второго. Фактически это просто конец рекурсии - в тот момент, когда список исчерпался, накопившееся во втором параметре значение надо начинать возвращать обратно.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума Prolog
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

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

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


 




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


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

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