Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Удаление элементов списка, согласно номерам второго списка SWI-Prolog 5.8.2
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
imported__ro imported__ro вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.01.2011
По умолчанию Удаление элементов списка, согласно номерам второго списка SWI-Prolog 5.8.2 - 10.01.2011, 00:28

Сабж. Например даны два списка:
[a,b,c,d,e,f] и [2,4]
надо удалить "b" и "d". Рез-т [a,c,e,f]
У меня не работает рекурсивный предикат.

Делаю так:

cpp Код:
% Сортировка второго списка в убывающем порядке вставкой:
insort([],[]).
insort([X|L],M) :-
        insort(L,N),
        insortx(X,N,M).
insortx(X,[A|L],[A|M]) :-
        order(A,X),
        !,
        insortx(X, L, M).
insortx(X, L, [X|L]).
order(X, Y):- X >= Y.

% Удаление дубликатов из второго списка:
rmDupl(L,Res) :-
        rmDupl(L,[],Res).
rmDupl([A|L],X,Res) :-
        member(A,X),
        !,
        rmDupl(L,X,Res).
rmDupl([A|L],X,[A|Res]) :-
        rmDupl(L,[A|X],Res).
rmDupl([],_,[]).
member(A,[A|_]) :-
        !.
member(A,[_|L]) :-
        member(A,L).

% Удаление элемента из первого списка по номеру:
del(1,[_|T],T):- !.
del(N,[H|T],[H|L]) :-
        N1 is N-1,del(N1,T,L).

% Тут собираю все вместе:
downRmdSort(L2,L) :-
        insort(L2,L1),
        rmDupl(L1,L).

% Этот предикат не работает =((
delByList(L1,[H|T],L) :-
        del(H,L1,L),
        delByList(L,T,_).

doTask(L2,L1,L) :-
        downRmdSort(L1,L3),
        L3 = [H|T],
        delByList(L2,[H|T],L).

Не работает предикат delByList. Вот его вызов:
cpp Код:
?- delByList([a,b,c,d,e,f,g],[4,2,1],L).
false.

Окажите помощь разъяснениями плз...
Ответить с цитированием
  (#2 (permalink)) Старый
aag aag вне форума
ушёл... не вернётся)))
 
Сообщений: 3,400
Сказал(а) спасибо: 0
Поблагодарили 82 раз(а) в 82 сообщениях
Регистрация: 29.11.2008
По умолчанию 10.01.2011, 01:12

Оно здесь есть... Причём многократно... А Вам в политику, наверное, надо, а не в программирование: понтов корявых куча, и всё бессмысленно при том - демократия ))))))))))))))
Ответить с цитированием
  (#3 (permalink)) Старый
imported__ro imported__ro вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.01.2011
По умолчанию 10.01.2011, 01:16

емко, очень даже
Ответить с цитированием
  (#4 (permalink)) Старый
aag aag вне форума
ушёл... не вернётся)))
 
Сообщений: 3,400
Сказал(а) спасибо: 0
Поблагодарили 82 раз(а) в 82 сообщениях
Регистрация: 29.11.2008
По умолчанию 10.01.2011, 01:35

[a,b,c,d,e,f] и [2,4]
надо удалить "b" и "d". Рез-т [a,c,e,f]


prolog Код:
DOMAINS
c=char   cl=c*
i=integer   il=i*
PREDICATES
p(i,cl,il,cl)
CLAUSES
p(A,[_|B],[A|C],D):- !, An=A+1, p(An,B,C,D).
p(A,[B|C],D,[B|E]):- !, An=A+1, p(An,C,D,E).
p(_,_,_,[]).

prolog Код:
Goal: p(1,['a','b','c','d','e','f'],[2,4,3000],Out)
Out=['a','c','e','f']
1 Solution
Ответить с цитированием
  (#5 (permalink)) Старый
imported__ro imported__ro вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.01.2011
По умолчанию 10.01.2011, 01:38

Может у кого другие будут мысли по поводу граничного условия выхода?
Чет никак сообразить не могу.
ставлю
prolog Код:
delByList(L,[],_) :-!.

выходит после первой итерации. Да еще и ругается вот так
prolog Код:
Warning: mylst:47:
        Singleton variables: [L]
при загрузке
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
imported__ro imported__ro вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.01.2011
По умолчанию 10.01.2011, 01:49

prolog Код:
DOMAINS
...
p(A,[_|B],[A|C],D):- !, An=A+1, p(An,B,C,D).
p(A,[B|C],D,[B|E]):- !, An=A+1, p(An,C,D,E).
p(_,_,_,[]).
Интересно, псиб
Только вот первая переменная зачем? Счетчик?

ЗЫ: прошу прощения за воззвание к телепатии - мне арифметику низя =)
Ответить с цитированием
  (#7 (permalink)) Старый
aag aag вне форума
ушёл... не вернётся)))
 
Сообщений: 3,400
Сказал(а) спасибо: 0
Поблагодарили 82 раз(а) в 82 сообщениях
Регистрация: 29.11.2008
По умолчанию 10.01.2011, 02:01

Цитата:
Сообщение от _ro Посмотреть сообщение
Только вот первая переменная зачем? Счетчик?
Ага...

Цитата:
Сообщение от _ro Посмотреть сообщение
ЗЫ: прошу прощения за воззвание к телепатии - мне арифметику низя =)
Мона, только в SWI оно по другому выглядит: An is A+1, кажется...
Ответить с цитированием
  (#8 (permalink)) Старый
imported__ro imported__ro вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.01.2011
По умолчанию 10.01.2011, 02:26

Не, чет не то:
prolog Код:
?- cutit(1,['a','b','c','d','e','f'],[2,1,6,4,3000],L).
L = [a, c, d, e, f].
и с головами/хвостами я тут запутался совсем.

Таки может быть - почему у меня граничное условие выхода на первой итерации срабатывает?
Ответить с цитированием
  (#9 (permalink)) Старый
aag aag вне форума
ушёл... не вернётся)))
 
Сообщений: 3,400
Сказал(а) спасибо: 0
Поблагодарили 82 раз(а) в 82 сообщениях
Регистрация: 29.11.2008
По умолчанию 10.01.2011, 02:31

Цитата:
Сообщение от _ro Посмотреть сообщение
Не, чет не то:
prolog Код:
?- cutit(1,['a','b','c','d','e','f'],[2,1,6,4,3000],L).
L = [a, c, d, e, f].
и с головами/хвостами я тут запутался совсем.

Таки может быть - почему у меня граничное условие выхода на первой итерации срабатывает?
[2,1,6,4,3000] - я для сортированного тиснул))) Запустите с [1,2,4,6,3000]. Порадуйтесь. Найдите сортировку. Приделайте сортировку.
Ответить с цитированием
  (#10 (permalink)) Старый
imported__ro imported__ro вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.01.2011
По умолчанию 10.01.2011, 02:36

Дык все те "корявые понты" у меня, тащем-та и занимаются сортировкой и удалением дубликатов =)
Таки спасибо, ушел ловить хвосты/головы, разбираться с выходом из рекурсии.
Ответить с цитированием
  (#11 (permalink)) Старый
aag aag вне форума
ушёл... не вернётся)))
 
Сообщений: 3,400
Сказал(а) спасибо: 0
Поблагодарили 82 раз(а) в 82 сообщениях
Регистрация: 29.11.2008
По умолчанию 10.01.2011, 02:39

Или так:
prolog Код:
DOMAINS
c=char   cl=c*
i=integer   il=i*
PREDICATES
p(i,cl,il,cl)
mmbr(i,il,il)
CLAUSES
p(A,[_|B],C,D):-  mmbr(A,C,E), !, An=A+1, p(An,B,E,D).
p(A,[B|C],D,[B|E]):- !, An=A+1, p(An,C,D,E).
p(_,_,_,[]).

mmbr(A,[A|B],B):- !.
mmbr(A,[B|C],[B|D]):- mmbr(A,C,D).

prolog Код:
Goal: p(1,['a','b','c','d','e','f'],[2,1,6,4,3000],Out)
Out=['c','e']
1 Solution
Ответить с цитированием
  (#12 (permalink)) Старый
pavelr pavelr вне форума
Member
 
Сообщений: 207
Сказал(а) спасибо: 1
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 05.03.2010
По умолчанию 13.01.2011, 02:01

Я вот так сделал:
prolog Код:
domains
i=integer
il=i*
predicates
del(i,il,il)
del1(il,il,il)
um(il,il)
clauses
%Предикат del удаляет из списка элемент с номером N
del(1,[_|T],T):-!.
del(N,[X|T],[X|L]):-N1=N-1,del(N1,T,L).
%Предикат um уменьшает на 1 элементы списка(т.к.если мы удалим эл-т из списка,то порядковые номера сдвинутся на 1
um([],[]):-!.
um([X|T],[X1|T1]):-X1=X-1,um(T,T1).
%Непосредственно предикат удаления из 1 списка элементов с номерами,находящимися во 2 списке
del1(L,[],L):-!.
del1(L,[N1|NT],Res):-del(N1,L,Buf),um(NT,NT1),del1(Buf,NT1,Res).
goal
del1([-4,3,2,99,-34,91,-8,30,19,65],[1,5,8,9,10],L).
Ответить с цитированием
Ads
Ответ

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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление N последних элементов списка Sne*ana Prolog 13 18.10.2017 01:31
произведение элементов числового списка SWI-Prolog Vilinchik Prolog 23 05.06.2011 14:55
Написать программу преобразования списка которая реверсирует n элементов списка Ma3day Prolog 4 14.11.2010 14:07
Удаление элементов из списка Kate&Lena Prolog 9 11.05.2009 20:57
Удаление N последних элементов из списка umintsov Lisp 6 26.11.2008 12:02
удаление m элементов из списка, начиная с N-ой позиции mishgek Prolog 16 22.10.2008 19:07
Удаление N первых элементов списка Sne*ana Prolog 16 30.09.2008 20:01
Удаление первых и последних элементов списка. prihod Prolog 17 04.06.2007 16:13
Удаление всех четных элементов списка гульчачак Prolog 4 28.01.2007 13:09
Удаление I*N элементов из списка Kate_Explorer Prolog 7 17.01.2006 20:06
Удаление одинаковых элементов из списка imported_MasterX Prolog 2 25.04.2005 21:11
Создание динамического списка второго класса Anonymous Вопросы начинающих программистов 1 11.05.2003 18:26



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