Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Удаление I*N элементов из списка
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Kate_Explorer Kate_Explorer вне форума
Member
 
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.12.2004
По умолчанию Удаление I*N элементов из списка - 23.12.2004, 22:23

Народ!!! Помогите, плиззз! Написала прогу, которая должна удалять элементы списка под номерами I*N, где I вводит пользователь, я N натуральные числа. Это все на Прологе. Он он мне выдает переполнение стека, уже до 4000 увеличила и все равно не помогает... HELP!!!
Код:
domains
list=integer*

predicates
del(integer,list,list)
number(integer,list,integer)
result(integer,integer,list,list)
inc(integer)

clauses
inc(1).
inc(N):-inc(N1),N=N1+1.

number(1,[A|B],A).
number(N,[A|B],X):-M=N-1,number(M,B,X).

del(X,[X|L1],L1).
del(X,[A|B],[A|B1]):-
del(X,B,B1).

result(_,_,[],[]).
result(I,N,[K|D],[V|Y]):-
I1=I*N,
inc(N),
number(I1,[K|D],X),
del(X,[K|D],[V|Y]),
result(I,N,D,Y).
P.S заранее спасибо, и как можно быстрее, а то сроки поджимают!!!
Ответить с цитированием
  (#2 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 24.12.2004, 10:50

Как-то сложно делаете, проще так
Код:
domains
list=integer*
predicates
del(integer,list,list,integer)
clauses
del(I,[_|L],L1,Pos):- Pos mod I=0,!,Pos1=Pos+1,
    del(I,L,L1,Pos1).
del(I,[A|L],[A|L1],Pos):- Pos1=Pos+1,del(I,L,L1,Pos1).
del(_,[],[],_).
goal
I=3,L=[1,2,3,4,5,6,7,8,9,10],
del(I,L,ResList,1).
Ответить с цитированием
  (#3 (permalink)) Старый
Kate_Explorer Kate_Explorer вне форума
Member
 
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.12.2004
По умолчанию 24.12.2004, 15:29

В принципе ничего сложного, один предикат находит элемент с нужным номером, другой предикат удаляет этот элемент, а в предикате result вызываются оба, также там N увеличиавется и он сам вызыввается рекурсивно!!! Но большое тебе спасибо, тока скажи,зачем там pos mod i =0 ???
Ответить с цитированием
  (#4 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 24.12.2004, 15:49

Pos - это номер текущего элемента. Если он делится нацело на I, т.е. Pos mod I = 0, то элемент с этим номером удаляется, а если номер не делится, то элемент остается в списке. Таким образом, удаляются все элементы с номерами I, 2*I, 3*I, ...
Ответить с цитированием
  (#5 (permalink)) Старый
Kate_Explorer Kate_Explorer вне форума
Member
 
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.12.2004
По умолчанию 24.12.2004, 15:55

ТОЧНО!!! Спасибо тебе ОГРОМНОЕ, ОЧЕНЬ ОГРОМНОЕ!!!
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
ndn ndn вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 21.10.2005
По умолчанию 17.01.2006, 14:23

Помогите изменить эту программу, чтобы из исходного списка получить список после удаления всех элементов, стоящих на чётных местах.
Подозреваю, что это очень просто, однако, мозгов не хватает!
Ответить с цитированием
  (#7 (permalink)) Старый
TypucT TypucT вне форума
Member
 
Сообщений: 336
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.10.2005
По умолчанию 17.01.2006, 14:29

это проще
Код:
odd([A,_|L],[A|L1]):-!,
        odd(L,L1).
odd(L,L).
Ответить с цитированием
  (#8 (permalink)) Старый
ndn ndn вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 21.10.2005
По умолчанию 17.01.2006, 20:06

И, действительно, всё просто. Видимо, с логикой у меня совсем хреново. Я-то, как дурак пытался использовать 'Pos mod I = 0'. У моей благодарности, как говорится, нет конца.
Ответить с цитированием
Ads
Ответ

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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление N последних элементов списка Sne*ana Prolog 13 18.10.2017 01:31
Удаление элементов списка, согласно номерам второго списка SWI-Prolog 5.8.2 imported__ro Prolog 11 13.01.2011 02:01
Написать программу преобразования списка которая реверсирует 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
Удаление последних элементов Sne*ana Prolog 7 12.11.2008 20:00
удаление 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
Удаление элементов тз дерева UIN С/С++ 3 03.01.2006 11:09
Удаление одинаковых элементов из списка imported_MasterX Prolog 2 25.04.2005 21:11



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