Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Слияние списков, Лишить список сложности 
V
    Опции темы
_Dream
Дата 20.11.2006, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 4.11.2006
Где: Там

Репутация: нет
Всего: нет



Привет.. может кто знает как сделать.

дан список сколь угодно вложенности
(q,w,(e,r),(t,y,(u,i),o).. (p)) ноадо сделать из этого списка один простой
(q,w,e,r,t,y,u,i,o,p)

заранее спасибо smile
--------------------
Noone dies a virgin. Life screws us all...
PM MAIL ICQ GTalk   Вверх
_Dream
Дата 20.11.2006, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 4.11.2006
Где: Там

Репутация: нет
Всего: нет



на худой конец можно просто постараться обмануть препода(не сильно шарящего в программухе) путем просто удаления из строки всех символов "(" и ")"...  smile 
кто нить это знает как сделать? smile
--------------------
Noone dies a virgin. Life screws us all...
PM MAIL ICQ GTalk   Вверх
maxim1000
Дата 20.11.2006, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: нет
Всего: 110



ну зачем же так жутко? smile
Пролога не помню, но всплывает что-то типа этого:

Joiner ( [ [A|B] | T] , X) <- Joiner( [ A | [B|T] ] , X)
Joiner ( [A | [B|T] ] , X) <- Joiner( [B|T], [A|X])

первое высказывание работает для тех случаев, когда первый элемент - список, в этом случае оно просто перегоняет хвост первого элемента в голову второго, а первый делает единственным (если он в свою очередь не был списком)
второй - в остальных - просто "прикрепляет" первый элемент к результату (правда, после всего этого надо его ещё будет развернуть)...

Добавлено @ 18:33 
упс, напутал:
Joiner ( [A | [B|T] ] , [A|X] ) <- Joiner( [B|T],X)
ну и Joiner ([],[])


--------------------
qqq
PM WWW   Вверх
skyboy
Дата 20.11.2006, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: нет
Всего: 260



у нас присоединяемый элемент либо список, либо не-список. 
если не список - просто бросаем его в голову результата.
если список - рекурсивно вызываем тот же предикат для головы списка и для хвоста.
после всего, как верно заметил maxim1000, список разворачиваем. Ибо бросать элементы можем только в голову.
Вечером попаду домой к интерпретатору - набросаю программу
PM MAIL   Вверх
maxim1000
Дата 20.11.2006, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: нет
Всего: 110



можно даже попробовать избавиться от необходимости разворота так:
Joiner ( [ [A|B] | T], X) <- Joiner ( [A | [B|T] ], X)
Joiner ( [A | B] , [A | X] ) <- Joiner (B,X)

хотя не уверен, с Прологом после университета не сталкивался...


--------------------
qqq
PM WWW   Вверх
Guedda
Дата 20.11.2006, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 2
Всего: 78



Цитата(maxim1000 @  20.11.2006,  18:25 Найти цитируемый пост)
Joiner ( [ [A|B] | T] , X)

В такой ситуации первый подсписок вовсе не список, так как стоит знак |. Поэтому прохождение по списку результата не даст. 
На этот вопрос пока ответить не могу. Завтра у препода спрошу, и всё здесь распишу.


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
Artemios
Дата 21.11.2006, 02:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 6
Всего: 50



Из Братко:
Код

конк( [ ], L, L ).        % конкатенация списков
конк( [X | L1], L2, [X | L3]) :- конк( L1, L2, L3).

линеаризация( [Голова | Хвост], ЛинейныйСписок ) :-      % Линеаризация непустого списка
     линеаризация( Голова, ЛинейнаяГолова ),
     линеаризация( Хвост, ЛинейныйХвост ),
     конк( ЛинейнаяГолова, ЛинейныйХвост,  ЛинейныйСписок ).
линеаризация( [ ], [ ] ).        % Линеаризация пустого списка
линеаризация( X, [X] ).       % Линеаризация объекта, не являющегося списком 


Добавлено @ 02:15 
Цитата(maxim1000 @  20.11.2006,  18:25 Найти цитируемый пост)
Joiner

Если я не ошибаюсь, в Прологе с большой буквы только переменные...

Это сообщение отредактировал(а) Artemios - 21.11.2006, 10:55


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
_Dream
Дата 21.11.2006, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 4.11.2006
Где: Там

Репутация: нет
Всего: нет



ой всем спасибо за советы..
а может кто код накидать?   smile а то я с прологом совсем не дружу  smile 
--------------------
Noone dies a virgin. Life screws us all...
PM MAIL ICQ GTalk   Вверх
Artemios
Дата 21.11.2006, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 6
Всего: 50



Цитата(_Dream @  21.11.2006,  14:37 Найти цитируемый пост)
а может кто код накидать? 

Если возьмешь мой пример, сохранишь в файл, например linlist.pl, а потом запустишь swi-prolog,
то на приглашение интерпретатора ?-  вводи следующее:
Код

?- consult('путь к файлу linlist.pl').
?- линеаризация( [[[а],г,[е,ж],и],л,[м,[[[о]]]],[[р]],[]] , Ж ).

где 'путь к файлу linlist.pl' -- путь к файлу linlist.pl smile, то тогда интерпретатор 
тебе выдаст следующее:
Цитата

Ж = [а, г, е, ж, и, л, м, о, р]


Добавлено @ 15:56 
P.S. Иные интерпретаторы могут непонимать русских букв, тогда назовешь все латинскими.

Добавлено @ 16:01 
P.P.S
Только не используй Turbo или Visual Prolog -- это издевательство над языком программирования!


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
_Dream
Дата 24.11.2006, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 4.11.2006
Где: Там

Репутация: нет
Всего: нет



а что на турбо прологе по другому будет? у нас там стоит именно он и без прав никакой сви- или даже вижуал пролог я не поставлю..  smile 
--------------------
Noone dies a virgin. Life screws us all...
PM MAIL ICQ GTalk   Вверх
Guedda
Дата 25.11.2006, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 2
Всего: 78



Цитата(_Dream @  24.11.2006,  19:25 Найти цитируемый пост)
на турбо прологе по другому будет?

Просто на Турбо Прологе не используй русских букв. А всё называй английскими буквами. И всё будет нормально smile


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
Artemios
Дата 25.11.2006, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 6
Всего: 50



Цитата(Guedda @  25.11.2006,  08:18 Найти цитируемый пост)
Просто на Турбо Прологе не используй русских букв. А всё называй английскими буквами. И всё будет нормально

И только? smile
Просто я отрицательно отношусь к этим прологам потому, разработчики слишком далеко отошли от т.н. "чистого" пролога, даже обидно, что оставили название "Пролог".

Цитата(_Dream @  24.11.2006,  19:25 Найти цитируемый пост)
а что на турбо прологе по другому будет?

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


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
skyboy
Дата 25.11.2006, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: нет
Всего: 260



Цитата(Artemios @  25.11.2006,  09:32 Найти цитируемый пост)
также заранее описать все используемые предикаты

ну, предикаты не проблема - алгоритм-то есть. А вот с доменами(типом), как я понял, полный ноль smile
_Dream, пущай хитрый преподаватель расскажет тебе, как описать domains для списка integer неограниченного уровня вложенности smile
PM MAIL   Вверх
_Dream
Дата 25.11.2006, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 4.11.2006
Где: Там

Репутация: нет
Всего: нет



"хитрый преподователь" полный 0 в прологе потому я предлагал даже на хитрость пойти.. он не поможет. а спрашивать будет.. у нас чего-то решили сделать по этому предмету зачет, а если задачу решаешь то автомат smile потому сюда и выложил.. 
PS для меня все эти предикаты.. темный лес =)
PPS да я понимаю это нагло  smile  но может напишите всю прогорамму от и до? =) 
на турбо прологе. не обязательно теоритически-бесконечные списки(если в этом сложность) буду премного благодарен  smile 
PPPS поставил бы пиво но вы все из других городов я уверен =)

Это сообщение отредактировал(а) _Dream - 25.11.2006, 17:46
--------------------
Noone dies a virgin. Life screws us all...
PM MAIL ICQ GTalk   Вверх
brianosally
Дата 23.12.2010, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 22.12.2010

Репутация: нет
Всего: нет



Цитата(Artemios @ 21.11.2006,  02:12)
Из Братко:
Код

конк( [ ], L, L ).        % конкатенация списков
конк( [X | L1], L2, [X | L3]) :- конк( L1, L2, L3).

линеаризация( [Голова | Хвост], ЛинейныйСписок ) :-      % Линеаризация непустого списка
     линеаризация( Голова, ЛинейнаяГолова ),
     линеаризация( Хвост, ЛинейныйХвост ),
     конк( ЛинейнаяГолова, ЛинейныйХвост,  ЛинейныйСписок ).
линеаризация( [ ], [ ] ).        % Линеаризация пустого списка
линеаризация( X, [X] ).       % Линеаризация объекта, не являющегося списком 


Добавлено @ 02:15 
Цитата(maxim1000 @  20.11.2006,  18:25 Найти цитируемый пост)
Joiner

Если я не ошибаюсь, в Прологе с большой буквы только переменные...

%линеаризация(уничтожение многоуровневости списка к пр. [a,[b,[c]]] --> [a,b,c])

lineariz([H|L],L1):-lineariz(H,LS),lineariz(L,LS2),union_lists(LS,LS2, L1).
lineariz([],[]).
lineariz(H,[H]).

[a,[b,[c]]] --> [a,b,c]
[a,[b,[c]]] --> [a,b,c,[]]
[a,[b,[c]]] --> [a,b,c,[],[]]
[a,[b,[c]]] --> [a,b,c[],[],[]]
...........................................
[a,[b,[c]]] --> [a,b,[c]] и т. д.


Но если добавить ! в выражение, то обратный ход отсечется, как и куча лишних вариантов:

%линеаризация(уничтожение многоуровневости списка к пр. [a,[b,[c]]] --> [a,b,c])

lineariz([H|L],L1):-lineariz(H,LS),lineariz(L,LS2),!,union_lists(LS,LS 2,L1).
lineariz([],[]).
lineariz(H,[H]).


результат :
[a,[b,[c]]] --> [a,b,c]

%второй вариант у меня так и не заработал, но может кто усовершенствует:
%lineariz([[H|L]|H1],L2):-lineariz([H|[L|H1]],L2).
%lineariz([H|[L|H1],[H|L2]):-lineariz([L|H1],[H|L2]).
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума Prolog
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Prolog | Следующая тема »


 




[ Время генерации скрипта: 0.3725 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.