![]() |
|
|
![]()
|
|
| lais |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 18.2.2011 Репутация: нет Всего: нет |
Здравствуйте дорогие форумчане и уважаемые администраторы и модераторы форума, помогите Пожалуйста справиться с задачей!!!
Задание выглядит так Для заданного списка строк, построить новый список, элементы которого расположены в зеркальном отражении относительно исходного списка, например для списка [a, b, c, d] нужно получить [d, c, b, a] Эту задачу я нашла на одном из 2-х форумов (я не помню какой но один из них был этот форум, я извиняюсь за забывчивость она выглядит так list=string* reverse(list,list). append(list,list,list). append([],L,L). append([H|T],L2,L3):- append(T,[H|L2],L3), reverse([],[]). reverse(L,L1):- append(L,[],L1). goal L1=["1","2","3","a","b","c"], reverse(L1,L2), write(L1),nl,write(L2). Я переделала её под Strawberry Prolog, вроде все работает, только компилятор выдает замечание Warning 6: The predicate =(...) is defined in the ADD file. (clause 0) 0 errors, 1 warning. А результат такой [1,2,3,a,b,c] [c,b,a,3,2,1]Yes. сама программа выглядит так list=string* reverse(list,list). sliyanie(list,list,list). sliyanie([],L,L). sliyanie([H|T],L2,L3):- sliyanie(T,[H|L2],L3), reverse([],[]). reverse(L,L1):- sliyanie(L,[],L1). ?-L1=["1","2","3","a","b","c"], reverse(L1,L2), write(L1),nl,write(L2). В чем дело я понять так и не могу, для себя объяснила эту задачу так Строка 3 L1 и L2 - списки, а L3 - их соединение. Начиная с 4-й строки и до реверсии 1. Если присоединить пустой список [] к списку L, то получим список L. sliyanie([],L,L). sliyanie([H|T],L2,L3):- sliyanie(T,[H|L2],L3), 5 строка Если присоеденить не пустой список [H|T] к списку L2, то результатом будет список L3, где L3 получаeтся соединением тела списка [H|T] к [H|L2] С точки зрения процедурной семантики первое предложение - терминальное условие, второе - рекурсивное с хвостовой рекурсией Пустой список после обращения - пустой. reverse([], []). Обратить список [X|L1] и получить список L2 можно, если обратить список L1 в L3 и в хвост ему добавить X reverse([X|L1], L2):-reverse(L1, L3), append( L3, [X], L2). reverse([X|L1], L2):-reverse(L1, L3), append( L3, [X], L2). Вот этот алгоритм хвостовой рекурсии вместе с реверсией мне так и не понятен...............Если кто может,объясните Пожалуйста,мне достаточно всего лишь проследить перемещение одного элемента списка и я всё пойму, а как это сделать я не знаю Заранее спасибо всем! |
|||
|
||||
![]()
|
| Правила форума Prolog | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Prolog | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |