Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Работа со списками.
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
status status вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.04.2008
Thumbs up 27.10.2008, 16:29

Помогите пожалуйста, реализовать 2 задачи над списками, работаю в Turbo Prolog 2.0 :

Вводится список, элементами является числа. Осуществить след. операции:
1.инверсия списка;
2.копирование i-го элемента с начала списка в конец списка;

В теме "25 задач про списки" видел задачу про инверсию, но я там не понял как сделать простуо инверсию целого списка.
Ответить с цитированием
  (#2 (permalink)) Старый
status status вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.04.2008
Thumbs up 27.10.2008, 16:29

Помогите пожалуйста, реализовать 2 задачи над списками, работаю в Turbo Prolog 2.0 :

Вводится список, элементами является числа. Осуществить след. операции:
1.инверсия списка;
2.копирование i-го элемента с начала списка в конец списка;

В теме "25 задач про списки" видел задачу про инверсию, но я там не понял как сделать простуо инверсию целого списка.
Ответить с цитированием
  (#3 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,781
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 27.10.2008, 21:22

В других темах поищите. Из года в год здесь повторяются одни и те же задачи. Подобные Вашей тоже были много раз.
Вы можете посмотреть темы, которые были примерно в то же время, как Вам задали эту задачу. Ну и/или использовать поиск.
Ответить с цитированием
  (#4 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,781
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 27.10.2008, 21:22

В других темах поищите. Из года в год здесь повторяются одни и те же задачи. Подобные Вашей тоже были много раз.
Вы можете посмотреть темы, которые были примерно в то же время, как Вам задали эту задачу. Ну и/или использовать поиск.
Ответить с цитированием
  (#5 (permalink)) Старый
status status вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.04.2008
По умолчанию 27.10.2008, 22:22

Просмотрел темы которые выдал поиск на слово "списки", и нашёл первую задачу но я не понимаю как реализовать её на Turbo Prologe? а то я новичок в прологе вообще.
Цитата:
Я здесь набросал на SWI, ничего переделывать не надо:
<div class='codetop'>Код Prolog
<div class='codemain'>Код
rev(X,Z):-rev(X,[],Z).
rev([A|X],Y,Z):-rev(A,B),!,rev(X,[B|Y],Z).
rev([],Z,Z):-!.
rev(Z,_,Z).[/code][/quote]

а что-то похожее на вторую задачу я не нашёл, помогите! :\
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
status status вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.04.2008
По умолчанию 27.10.2008, 22:22

Просмотрел темы которые выдал поиск на слово "списки", и нашёл первую задачу но я не понимаю как реализовать её на Turbo Prologe? а то я новичок в прологе вообще.
Цитата:
Я здесь набросал на SWI, ничего переделывать не надо:
<div class='codetop'>Код Prolog
<div class='codemain'>Код
rev(X,Z):-rev(X,[],Z).
rev([A|X],Y,Z):-rev(A,B),!,rev(X,[B|Y],Z).
rev([],Z,Z):-!.
rev(Z,_,Z).[/code][/quote]

а что-то похожее на вторую задачу я не нашёл, помогите! :\
Ответить с цитированием
  (#7 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,988
Сказал(а) спасибо: 2
Поблагодарили 303 раз(а) в 303 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 27.10.2008, 22:58

Код:
domains
il = integer*
predicates
rev(il,il)
rev(il,il,il)
goal rev([1,2,3,4,5],L), write(L).
clauses
rev(X,Z):-rev(X,[],Z).
rev([A|X],Y,Z):-rev(A,B),!,rev(X,[B|Y],Z).
rev([],Z,Z):-!.
rev(Z,_,Z).
Ответить с цитированием
  (#8 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,988
Сказал(а) спасибо: 2
Поблагодарили 303 раз(а) в 303 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 27.10.2008, 22:58

Код:
domains
il = integer*
predicates
rev(il,il)
rev(il,il,il)
goal rev([1,2,3,4,5],L), write(L).
clauses
rev(X,Z):-rev(X,[],Z).
rev([A|X],Y,Z):-rev(A,B),!,rev(X,[B|Y],Z).
rev([],Z,Z):-!.
rev(Z,_,Z).
Ответить с цитированием
  (#9 (permalink)) Старый
status status вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.04.2008
По умолчанию 28.10.2008, 00:16

у меня ругается что A - 505 Type error: Illegal variable type for this position. Что надо сделать?
Ответить с цитированием
  (#10 (permalink)) Старый
status status вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.04.2008
По умолчанию 28.10.2008, 00:16

у меня ругается что A - 505 Type error: Illegal variable type for this position. Что надо сделать?
Ответить с цитированием
  (#11 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,988
Сказал(а) спасибо: 2
Поблагодарили 303 раз(а) в 303 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 28.10.2008, 00:43

Прошу прощения. Здесь товарищ привёл "левый" код реверса, а я его взял не глядя. Вот правильно:
Код:
domains
il = integer*
predicates
rev(il,il)
rev(il,il,il)
goal rev([1,2,3,4,5],L), write(L).
clauses
rev(X,Z):-rev(X,[],Z).
rev([],Z,Z).
rev([A|X],Y,Z):-rev(X,[A|Y],Z).
Ответить с цитированием
  (#12 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,988
Сказал(а) спасибо: 2
Поблагодарили 303 раз(а) в 303 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 28.10.2008, 00:43

Прошу прощения. Здесь товарищ привёл "левый" код реверса, а я его взял не глядя. Вот правильно:
Код:
domains
il = integer*
predicates
rev(il,il)
rev(il,il,il)
goal rev([1,2,3,4,5],L), write(L).
clauses
rev(X,Z):-rev(X,[],Z).
rev([],Z,Z).
rev([A|X],Y,Z):-rev(X,[A|Y],Z).
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
status status вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.04.2008
По умолчанию 28.10.2008, 22:29

А можно прокомментировать работу, какую функцию выполняет rev(X,Z):-rev(X,[],Z).
когда если я правильно понимаю:
rev([],Z,Z).
rev([A|X],Y,Z):-rev(X,[A|Y],Z). выполняет разделение данного списка на голову и хвост, и голову добавляем в новый список пока исходный не будет пустым, и Z присваиваем результата. правильно ли я понимаю?
Ответить с цитированием
  (#14 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,988
Сказал(а) спасибо: 2
Поблагодарили 303 раз(а) в 303 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 29.10.2008, 17:43

rev(X,Z):-rev(X,[],Z). является интерфейсным предикатом, который делает только одно - добавляет ещё один аргумент, служебный, для собственно реверса. Этот аргумент - пустой список. Он нужен для того, чтобы в него накапливать исходный список в реверсном порядке.
По идее можно было бы обойтись и без него. Но тогда пришлось бы всегда для реверса списка X в список Y вызывать предикат вот так: rev(X,[],Z). , т.е. сразу указывать служебный пустой список.
Ответить с цитированием
  (#15 (permalink)) Старый
status status вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.04.2008
По умолчанию 31.10.2008, 17:53

Можете помочь по первой задаче где копирование К-го элемента числа, почему он у меня добавляет нужный элемент к пустому списку???!
Код:
domains
X,K,B=integer
il=integer*
predicates
c_list(il,il)
write_list(il)
attach_at_tail(il,integer,il)
copy(il,K)
append(il,il,il)
goal

c_list([],List),write("Enter K:"),
readint(K),copy(List,K).

clauses
c_list(L1,List):- write("Enter: "),nl,
        readint(X),X<>0,
        attach_at_tail(L1,X,L2),
        c_list(L2,List).
c_list(L1,List):-List=L1,write_list(List),nl.

copy([H|T],K):- K>1,K1=K-1,copy(T,K1);B=H,
        attach_at_tail(List,B,Res),write_list(Res).
            

write_list([]).
write_list([H|T]):- write(H,","),
        write_list(T).
        
attach_at_tail([],X,[X]).
attach_at_tail([H|T],X,[H|T1]):- 
            attach_at_tail(T,X,T1).
append([],L,L).
append([X|L1],L2,[X|L3]):- append(L1,L2,L3).
Ответить с цитированием
Ответ

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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа со списками 3ai4i6ka Prolog 0 20.10.2011 22:12
Работа со списками ELEKTRI4KA Prolog 3 07.06.2011 01:22
Работа со списками. BLACKRIDER Prolog 3 10.05.2010 12:34
работа со списками Novichok92 Prolog 1 10.11.2009 19:15
работа со списками FEAR Prolog 8 09.11.2009 01:08
работа со списками ShokoLad Prolog 18 24.07.2009 02:53
работа со списками из_семи Prolog 12 04.05.2009 01:22
Работа со списками wert30 Prolog 2 24.01.2009 16:04
Работа со списками Михаил_1987 Prolog 3 19.01.2009 09:18
Работа со списками izen Prolog 1 04.05.2008 21:55
Работа со списками NRGize Prolog 2 25.05.2007 00:43
Работа с списками ViL Prolog 1 15.04.2006 08:51



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