Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Простейший список
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Lucia Lucia вне форума
Новичок
 
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 22.09.2006
По умолчанию 26.09.2006, 07:45

Добрый день!
Это моя первая программа на Прологе. Прибавить к элементам списка L1 число N, L2 - результирующий список. Например: add([1,3,4],2,L2). Результат: L2=[3,5,6]. Ругается на переменную N. Помогите, кто знает, пожалуйста. Заранее спасибо.

Код:
domains
  integerlist=integer*
  N=integer
predicates
  add(integerlist,integerlist,integerlist)
clauses
add([],N,N).
add([X|L1],N,[X|L2]):-L2=X+N,add(L1,N,L2).
Ответить с цитированием
  (#2 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 26.09.2006, 13:28

Надо бы разобраться с некоторыми вопросами.
1. Если к каждому элементу пустого списка прибавить число, что должно получиться?
2. Во втором предложении для предиката add: если к числу X прибавляется число N, то в результате получается список или число? (наверное, там просто опечатки, как минимум - две)
3. По поводу объявления предиката. Второй аргумент в предикате add - это должен быть список или число?
4. Домен N=integer нигде не используется. Наверное, он и не нужен?
Ответить с цитированием
  (#3 (permalink)) Старый
Lucia Lucia вне форума
Новичок
 
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 22.09.2006
По умолчанию 26.09.2006, 15:17

1. Должен получиться список состоящий из чисел N. Например: N = 2, то L3 = [2,2,2].
2. Должен получиться список (там наверное не опечатки - это моя первая программа).
3. N - это число которое прибавляем к элементам первого списка.
Спасибо, что отозвались.
Ответить с цитированием
  (#4 (permalink)) Старый
ZhekaS ZhekaS вне форума
Member
 
Сообщений: 53
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 22.09.2006
По умолчанию 26.09.2006, 20:18

Цитата:
Код:
add([],N,N).
add([X|L1],N,[X|L2]):-L2=X+N,add(L1,N,L2).
В первом предложении, получив пустой список возвращается число N. Насколько я понял из условия - должен возвращаться пустой список :
Код:
add([],_,[]).
Во втором предложении, вместо того, что-бы складывать голову списка X с числом N и добавлять его в голову резултата, выполняется какая-то ерунда - сложение происходит, но его результат присваевается хвосту второго списка, а в голове находится исходный X.
нужно бы так:
Код:
add([X|L1],N,[X2|L2]):-X2=X+N,add(L1,N,L2).
Причем оператор "=" - это оператор сопоставления, и вычисления за собой не влечет. По-этому результатом будет что-то вроде:
Код:
?- add([1,2,3,4], 5, X).
X=[1+5, 2+5, 3+5, 4+5]
А если хотим все-таки вычисление, используем оператор "is" вместо "=".
Ответить с цитированием
  (#5 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,906
Сказал(а) спасибо: 2
Поблагодарили 297 раз(а) в 297 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 26.09.2006, 20:27

Цитата:
Причем оператор "=" - это оператор сопоставления, и вычисления за собой не влечет.
ZhekaS! Не надо быть столь категоричным. Иногда этим можно выдать свою низкую осведомлённость. Братко - это далеко не весь Пролог, а только ISO-шный Пролог.
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
ZhekaS ZhekaS вне форума
Member
 
Сообщений: 53
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 22.09.2006
По умолчанию 26.09.2006, 20:47

Цитата:
ZhekaS! Не надо быть столь категоричным. Иногда этим можно выдать свою низкую осведомлённость. Братко - это далеко не весь Пролог, а только ISO-шный Пролог.
Вы уж извините, но занимаюсъ только ISO-шным вариантом. Низкой осведомленности в различных имплементациях абсолютно не стыжусь, но считаю, что если программу можно написать как можно более близко к стандартам - то лучше так и делать. Портабельнее будет. А заниматься наездами друг на друга, предлагаю в специально отведенных для этого местах.
Ответить с цитированием
  (#7 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 27.09.2006, 17:27

Цитата:
1. Должен получиться список состоящий из чисел N. Например: N = 2, то L3 = [2,2,2].
2. Должен получиться список (там наверное не опечатки - это моя первая программа).
3. N - это число которое прибавляем к элементам первого списка.
Lucia, продолжаем разбираться.
1. Изначально нужно было получить следующее:
Цитата:
add([1,3,4],2,L2). Результат: L2=[3,5,6].
Ваш ответ 1 с этим не очень согласуется. Получается, что либо изначально Вы не так сформулировали проблему, и нужна другая операция, либо с пустым списком нужно обходиться иначе.
Будем исходить из того, что вопрос был правильный, а ответ 1 нет.
Вообще, как можно прибавить к каждому элементу списка заданное число?
Судя по Вашей программе, Вы это делаете рекурсивно (что правильно), в соответствии с определением: голова результата равна сумме головы исходного списка и заданного числа, а хвост результата равен результату прибавления заданного числа к хвосту исходного списка. Остается правильно записать и условие останова: если исходный список пуст, то и результат пуст.
Итого, как Вам уже подсказали ранее:
Код:
add([],_,[]).
add([X|L1],N,[X1|L2]):-X1=X+N,add(L1,N,L2).
2. Если сложить два числа, то получится число, а не список.
3. Вопрос относился к правильности объявления предиката. Его второй аргумент - число, а не список. Так что в разделы объявлений надо внести изменения:
Код:
domains
  integerlist=integer*
predicates
  add(integerlist,integer,integerlist)
Теперь все должно заработать.
Ответить с цитированием
  (#8 (permalink)) Старый
Lucia Lucia вне форума
Новичок
 
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 22.09.2006
По умолчанию 28.09.2006, 06:50

Alison, а N разве не надо описывать в разделе описаний?

Извените, заработало.
Спасибо всем за содействие и отдельно ALISON.
Но хотелось бы знать: почему не надо описывать N?
Ответить с цитированием
  (#9 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 28.09.2006, 20:01

Цитата:
Но хотелось бы знать: почему не надо описывать N?
Переменные в Прологе не описываются (не задаются). "Область видимости" переменной - одно предложение. Если в разных предложениях есть переменная с одинаковым именем (в одном N и в другом N), то они считаются разными переменными. И само по себе имя переменной значения не имеет.
Возьмем, например, второе предложение:
Код:
add([X|L1],N,[X1|L2]):-X1=X+N,add(L1,N,L2).
Кстати, здесь пять переменных, почему Вы хотите описывать только одну - N?
Вы можете заменить это предложение, например, таким:
Код:
add([A|X],K,[B|Y]):- B=A+K,add(X,K,Y).
Здесь вообще нет N. А программа будет работать правильно, так же, как и раньше.
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задан список произвольного уровня вложенности,превратить его в список атомов Дрон Lisp 6 19.11.2014 22:38
Простейший Flash баннер. veter48 Flash и ActionScript 0 27.04.2012 20:50
Простейший пример сложения не работает sniperm С/С++ 8 31.07.2011 20:54
программа которая берет список и создает список другой из этого же списка + исходный Ma3day Prolog 5 26.11.2010 15:40
Необходимо обработать простейший XML документ imported_california Visual C++ 9 30.03.2009 10:08
Задан список произвольного уровня вложенности, сформировать из него новый список Kolobov_Anton Lisp 3 26.03.2009 22:29
Простейший клиент-сервер Blax Delphi 1 02.03.2009 06:43
Как построить список из элементов 1го списка входящих во 2ой список Ирина 24 Lisp 3 10.02.2009 10:55
Как сделать простейший SNMP Query redex C++ Builder 4 02.07.2006 18:28
Как написать простейший HTTP-клиент Rutto C++ Builder 2 30.09.2004 13:15
Как сделать простейший цикл, состоящий только из команды условного перехода Anonymous Assembler 9 01.12.2003 21:50
Написать простейший алгоритм движения по экрану символа Vooov Assembler 0 23.11.2003 23:02



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов