Показать сообщение отдельно
  (#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).
Ответить с цитированием
Ads