Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Вывод номеров элементов списка по убыванию эл-ов
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
F@ntom F@ntom вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 04.10.2005
По умолчанию Вывод номеров элементов списка по убыванию эл-ов - 14.10.2005, 21:06

Помогите с такой прогой пожалуйста:
Есть список. Надо найти индекс наибольшего элемента и вывести этот индекс, далее индекс второго по убыванию элемента и тоже вывести... и т.д. Причем выводятся индексы поочереди после нажатия ;
Пример:
Код:
?-index([1,5,3,8,2,10],X)
   X=6;
   X=4;
   X=2;
   X=3; 
   X=5;
   X=1;
no
Есть идея : находить индекс максимального элемента, выводить его,удалять этот элемент и опять рекурсивно искать индекс

Вот нашел два предиката, а как их связать не знаю
Код:
max([H|T],I):-max(T,H,1,I). 
max([],M,Ind,Ind). 
max([H|T],M,I,Ind):-H>M, I1 is I+1, max(T,H,I1,Ind). 
max([_|A],M,I,H):-max(A,M,I,H).

del([A|L],K,[A|L1]):- K>1, K1 is K-1,del(L,K1,L1). 
del([_|L],1,L). 
del([],_,[]).
Помогите плз... или предложите свой вариант
Ответить с цитированием
  (#2 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 16.10.2005, 12:03

Можно сделать так: сначала к каждому элементу исходного списка добавляете номер:
[Элемент|Список] -> [Элемент,Номер|Список_с_номерами].
Потом сортируете полученный список по убыванию относительно элементов (любым методом сортировки), а номера должны оставаться каждый при своем элементе.
Затем для полученного списка используете предикат вроде недетерминированного member, только для выдачи каждого второго элемента.
Ответить с цитированием
  (#3 (permalink)) Старый
F@ntom F@ntom вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 04.10.2005
По умолчанию 22.10.2005, 17:23

Спасибо за идею.
Сделал по другому, так как сортровку с оставлением номеров при каждом элементе так и не осилил.
Прога работает так :
Добавляем к элементам списка номера ( как подсказала Alison), ищем индекс максимального элемента среди нечетных элементов( предикат max), удаляем его, возвращаем элемент по этому индексу (теперь там уже находится как раз номер максим. эл-та (предикат ret)), удаляем снова этот элемент по индексу, добавляем в конец нового списка элемент, который вернул ret. И так пока исходный список не опусташится. Затем выводим элементы второго списка при помощи member.

Код:
Код:
result(List,Res):- addnum(List,R,[],0), index(R,[],New),!, member(New,Res).

addnum([],New,New,_).
addnum([G|X],New,T,C):-C1 is C+1, addnum(X,New,[G,C1|T],C1).

index([],Q,Q).
index(List1,N,NN):- 
                max(List1,Ind), 
                del(List1,Ind,List2),
                ret(List2,Ind,E),
                del(List2,Ind,List3),
                addlast(E,N,R1),
                index(List3,R1,NN).

max([H|T],I):-max(T,H,1,2,I). 
max([_],M,Ind,I2,Ind). 
max([X,Y|T],M,I,I2,Ind):-Y>M, I1 is I+I2, max(T,Y,I1,2,Ind). 
max([_,_|A],M,I,I2,H):-I3 is I2+2, max(A,M,I,I3,H).

del([A|L],K,[A|L1]):-  K>0, K1 is K-1, del(L,K1,L1). 
del([_|L],1,L). 
del([],_,[]).

ret(Sp,I,G):-ret(Sp,I,1,G).
ret([H|T],In,Ind,M):- In==Ind, Ind1 is Ind+1, ret(T,In,Ind1,M).
ret([H|T],In,Ind,H). 

addlast(Z,[],[Z]).
addlast(Z,[A|X],[A|R]):-addlast(Z,X,R).

member([Y|Z],Y).
member([K|T],X):- member(T,X).
Ответить с цитированием
  (#4 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 22.10.2005, 20:55

Я имела в виду такой способ:
Код:
domains
il=integer*
predicates
nondeterm номер(il,integer)
занумеровать(integer,il,il)
сорт(il,il,il)
вставить(integer,integer,il,il)
nondeterm принадл(integer,il)
goal  номер([1,5,3,8,2,10],X).
clauses
номер(Список,Номер):- занумеровать(1,Список,Спис1),
    сорт(Спис1,[],СортСпис),принадл(Номер,СортСпис).
    
занумеровать(Ном,[Эл|Сп],[Эл,Ном|НумСп]):- Ном1=Ном+1,занумеровать(Ном1,Сп,НумСп).
занумеровать(_,[],[]).

сорт([Эл,Ном|Сп],Сорт,СортСп):- вставить(Эл,Ном,Сорт,Сорт1),сорт(Сп,Сорт1,СортСп).
сорт([],СортСп,СортСп).

вставить(Эл,Ном,[Эл1,Ном1|Сп],[Эл1,Ном1|Сп1]):- Эл<Эл1,!,вставить(Эл,Ном,Сп,Сп1).
вставить(Эл,Ном,Сп,[Эл,Ном|Сп]).

принадл(Номер,[_,Номер|_]).
принадл(Номер,[_,_|Список]):- принадл(Номер,Список).
Он выводит то, что надо:
Код:
X=6
X=4
X=2
X=3
X=5
X=1
Здесь используется сортировка вставкой по убыванию элементов, а каждый номер так и остается при своем элементе.
Ответить с цитированием
  (#5 (permalink)) Старый
F@ntom F@ntom вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 04.10.2005
По умолчанию 23.10.2005, 00:32

Спасибо за ваш вариант, он действительно намного проще.
Ответить с цитированием
Ads.
Ads
Ответ

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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сумма элементов списка.. Trevon Prolog 2 09.02.2011 21:40
Процедура сортировки элементов по убыванию bee Visual Basic 11 19.01.2011 17:20
Удаление элементов списка, согласно номерам второго списка SWI-Prolog 5.8.2 imported__ro Prolog 11 13.01.2011 02:01
Все комбинации из элементов списка CKY Prolog 2 02.12.2010 12:06
Написать программу преобразования списка которая реверсирует n элементов списка Ma3day Prolog 4 14.11.2010 14:07
Составить Prolog-процедуру сортировки списка по убыванию Reg7 Prolog 1 17.10.2010 17:08
Перестановка элементов списка и вывод swdmitriy Prolog 1 05.06.2010 18:19
Вывод элемента списка с заданным номером(нумерация ведется с начала списка) Voennii-314 Prolog 3 12.12.2009 19:37
Удаление элементов из списка Kate&amp;Lena Prolog 9 11.05.2009 20:57
Выделение элементов из списка McClain Prolog 3 07.11.2007 00:33
K последних элементов списка. Не1еn Prolog 4 13.06.2007 11:28
Удаление I*N элементов из списка Kate_Explorer Prolog 7 17.01.2006 20:06



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