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

Не могу понять, в чем косяк, помогите, пожалуйста

1. Конкатенация двух упорядоченных по убыванию списков так, чтобы результирующий список также был упорядочен по убыванию

Код:
DOMAINS
    val  = integer
    list = integer*
PREDICATES
    sort(list, list, list)
    append(list, list, list)
    puzer(list, list) 
    up(list, list, integer) 
CLAUSES
    sort(L1, L2, L3):- append(L1, L2, L3).
    
    append(_, L, L):- puzer(L, L4). 
    append([X|L1], L2, [X|L3]):- append(L1, L2, L3). 
    
    puzer(L, X):- up(L, L1, 0), !, puzer(L1, X). 
    puzer(L, L). 
    up([X,Y|L],[Y|L1],_):-X>Y,!,up([X|L],L1,1). 
    up([X,Y|L],[X|L1],B):-!,up([Y|L],L1,B). 
    up(L,L,1).
Goal 

    sort([3, 9], [7,10, 4,1], L).
Выдает неупорядоченный список
Ответить с цитированием
  (#2 (permalink)) Старый
DaoDizzy DaoDizzy вне форума
Member
 
Сообщений: 58
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 06.02.2004
По умолчанию 25.02.2005, 13:45

Но в твоем вопросе списки не упорядочены по убыванию... и вообще судя по твоему запросу - и программе - они выполняют разные функции вот код... приблизительный.
Короче - надо разобраться с нужным результатом, и, возможне изменить в сортировке один знак. (Но я бы сделал весь код по другому. ))))))

Код:
sort(L1, L2, L3):- append(L1, L2, L3_), puzer(L3_,L3). 
append([], L, L) :-!. 
append([X|L1], L2, [X|L3]):- append(L1, L2, L3).
Ответить с цитированием
  (#3 (permalink)) Старый
kronix kronix вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 25.02.2005
По умолчанию 25.02.2005, 13:47

все оказалось просто, сам разобрался, всем спасибо! =)
теперь вот бьюсь ещё над одной задачкой, за помощь буду очень благодарен, потому что тут действительно тупик:

4. Для заданного списка сформировать список, который содержит те элементы исходного списка,
число вхождений которых в исходный список превышает заданного числа.
Ответить с цитированием
  (#4 (permalink)) Старый
kronix kronix вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 25.02.2005
По умолчанию 26.02.2005, 20:11

Ну же, кто-нибудь, помогите,пожалуйста, нифига не получается. Запутался уже со всеми этими списками
Ответить с цитированием
  (#5 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,781
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 26.02.2005, 20:55

Цитата:
Originally posted by kronix
[b]Ну же, кто-нибудь, помогите,пожалуйста, нифига не получается. Запутался уже со всеми этими списками
Но ведь на форуме похожие задачи уже не раз возникали. Поискали бы.
Вот два способа, первые, пришедшие в голову.
Способ 1. С БД.
Код:
domains
il=integer*
database
число(integer,integer)
predicates
статистика(il)
удалить(integer)
список(il)
clauses
статистика([H|T]):- retract(число(H,K)),!,K1=K+1,assert(число(H,K1)),статистика(T).
статистика([H|T]):- assert(число(H,1)),статистика(T).
статистика([]).

удалить(N):- число(H,K),K<=N,retract(число(H,K)),fail;true.

список([H|T]):- retract(число(H,_)),!,список(T).
список([]).
goal
статистика([1,2,5,3,2,4,3,2,3,1,1,1,4]),удалить(2),список(Ответ).
Способ 2. Без БД.
Код:
domains
il=integer*
predicates
статистика(il,il,il)
заменить(integer,il,il)
список(integer,il,il)
clauses
статистика([H|T],L,Res):- заменить(H,L,L1),статистика(T,L1,Res).
статистика([],L,L).

заменить(H,[H,K|T],[H,K1|T]):- !,K1=K+1.
заменить(H,[H1,K|T],[H1,K|T1]):- заменить(H,T,T1).
заменить(H,[],[H,1]).

список(N,[H,K|T],[H|L]):- K>N,!,список(N,T,L).
список(N,[_,_|T],L):- список(N,T,L).
список(_,[],[]).
goal
статистика([1,2,5,3,2,4,3,2,3,1,1,1,4],[],L),список(2,L,Ответ).
А на форуме точно есть еще способы.
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
kronix kronix вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 25.02.2005
По умолчанию 27.02.2005, 09:21

спасибо 2 вариант, то что нужно, а на форуме я искал - не нашел
Ответить с цитированием
Ads
Ответ

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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
и опять я) Пердунчик Любые вопросы от новичков 20 07.12.2011 23:59
Опять же ucoz... Пароль Веб-программирование 1 17.10.2011 16:00
Опять видеокарта Clyde Barrow Любые вопросы от новичков 9 05.08.2011 08:24
Опять OpenVpn volfram Сетевое программирование 0 08.07.2011 00:28
опять GTA EFLC kukureku007 Софт и программы 4 06.01.2011 22:31
опять чет не верно evgen1 Pascal 1 07.12.2010 23:03
Опять списки. snarkbird Prolog 1 28.11.2010 14:45
Опять синусы 000 Meri777 Prolog 6 13.12.2009 19:59
Опять списки Chummy89 Prolog 17 27.11.2009 22:04
Опять пролог! ОПЯТЬ СПИСКИ! Kate&amp;Lena Prolog 10 26.02.2009 08:39
Опять списки, и опять на SWI. ler Prolog 3 02.02.2006 07:32
опять про UTF-8 EuG PHP 2 02.08.2005 17:50



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