Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Prolog > реверсирование списка,состоящего из строк или помо


Автор: lais 15.4.2011, 19:25
Здравствуйте дорогие форумчане и уважаемые администраторы и модераторы форума, помогите Пожалуйста справиться с задачей!!!

Задание выглядит так

Для заданного списка строк, построить новый список, элементы которого расположены в зеркальном отражении относительно исходного списка, например для списка [a, b, c, d] нужно получить [d, c, b, a]

Эту задачу я нашла на одном из 2-х форумов (я не помню какой но один из них был этот форум, я извиняюсь за забывчивость  smile ,но если задача была опубликована на данном форуме, то киньте Пожалуйста ссылку с данной задачей (у меня недавно винта слетела- поэтому страницы с данной задачей нету,а скопировала я только начало программы без её исправлений, которые были на странице) программа была написана  в среде Visual Prolog

она выглядит так

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).

Вот этот алгоритм хвостовой рекурсии вместе с реверсией мне так и не понятен...............Если кто может,объясните Пожалуйста,мне достаточно всего лишь проследить перемещение одного элемента списка и я всё пойму, а как это сделать я не знаю smile 

Заранее спасибо всем!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)