Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.12.2011, 19:22   #1
AnDrOiD73
Пользователь
 
Регистрация: 05.06.2010
Сообщений: 21
По умолчанию Список деревьев, удаление из полученного списка элементов (Пролог)

Задание звучит так:
Имеется список, элементы которого – непустые бинарные деревья. Для каждого элемента списка найти число вершин, значения которых лежат в определенном диапазоне, из полученных результатов сформировать список (без использования стандартного предиката findall). Из полученного списка удалить 2-ой, 4-ой и т.д. элементы (т.е. удалить элементы находящиеся на четных позициях).

Собственно начал делать... язык пролога можно сказать не знаю, но кое что с помощью товарищей и преподавателя смог сделать.
А именно: из заданного дерева (а не из списка деревьев как по заданию нужно) добавлял в список L только те элементы, которые входят в заданный диапазон. Затем всё таки удалось сделать удаление, из этого списка, элементов на четных позициях.
Получилось вот что:
Код:
domains
tree=nil;t(integer,tree,tree)
i=integer
L=integer*
 
predicates
n(tree,L,integer,integer).
add(L,integer,L)
append(L,L,L)
deleteodd(L,L)
 
clauses
add([H|T],E,[H|Result]):- add(T,E,Result).
add([],E,[E]).
append([], L1, L1).
append([X|L1], L2, [X|L3]):- append(L1, L2, L3).
n(nil,[],Min,Max).
n(t(H,Left,Right),L,Min,Max):-H < Max, H > Min,!,n(Left,LL,Min,Max),n(Right,LR,Min,Max), append(LL,LR,LTemp), add(LTemp,H,L).
n(t(_,Left,Right),L,Min,Max):-n(Left,LL,Min,Max),n(Right,LR,Min,Max), append(LL,LR,L).
deleteodd([],[]):-!.
deleteodd([_],[]):-!.
deleteodd([HH|[_|L]],[HH|LL]):- deleteodd(L,LL),!.

goal
%n(t(6,t(3,nil,nil),t(7,nil,nil)),L,1,7),write(L).
n(t(5,t(3,t(7,nil,nil),nil),t(1,t(30,t(15,nil,nil),nil),t(4,nil,nil))),L,1,40), write("L=",L),nl, deleteodd(L,IL).
Ну после того как это было сделано и все работало, начала делать чтобы все это выполнялось уже для списка деревьев, но не получилось этого сделать - с этим и прошу помочь.
Получил вот такой код:
Код:
domains
tree=nil;t(integer,tree,tree)
i=integer
lint=integer*
listtree = tree* 
predicates
n(tree,lint,integer,integer).
add(lint,integer,lint)
append(lint,lint,lint)
deleteodd(lint,lint)
treelist(listtree,lint,integer,integer)
clauses
add([H|T],E,[H|Result]):- add(T,E,Result).
add([],E,[E]).
append([], L1, L1).
append([X|L1], L2, [X|L3]):- append(L1, L2, L3).
n(nil,[],Min,Max).
n(t(H,Left,Right),L,Min,Max):-H < Max, H > Min,!,n(Left,LL,Min,Max),n(Right,LR,Min,Max), append(LL,LR,LTemp), add(LTemp,H,L).
n(t(_,Left,Right),L,Min,Max):-n(Left,LL,Min,Max),n(Right,LR,Min,Max), append(LL,LR,L).
deleteodd([],[]):-!.
deleteodd([_],[]):-!.
deleteodd([HH|[_|L]],[HH|LL]):- deleteodd(L,LL),!.
treelist([],L,Min,Max) :- !.
treelist([H|T], L, Min, Max) :- n(H, [L1], Min, Max), treelist(T, L2, Min, Max), L=[L1|L2].

goal
%n(t(6,t(3,nil,nil),t(7,nil,nil)),L,1,7),write(L).
%n(t(5,t(3,t(7,nil,nil),nil),t(1,t(30,t(15,nil,nil),nil),t(4,nil,nil))),L,1,40), write("L=",L),nl, deleteodd(L,IL).
LT1 = t(1,nil,nil),   
    LT2 = t(2,t(3,nil,nil),nil),                               
    LT3 = t(4,nil,t(5,t(6,nil,nil),nil)),                               
    LT4 = t    (7,    t(8,nil, nil), 
                    t(9,
                        t(10,nil, nil),
                        t(11, 
                            t( 12, nil,
                                t(13, nil,nil)
                            ),
                            nil
                        )
                    )
                ), 
treelist([ LT1, LT2, LT3, LT4 ],L,1,10), write("L=",L),nl, deleteodd(L,IL).
Начал ругаться на домен lint=integer*
E;Test_Goal, pos: 49, 721 Basic domain becomes reference domain: integer

Ну я заменил строку
treelist([],L,Min,Max) :- !.
на
treelist([],[],Min,Max) :- !.

Программа запустилась, но выдало ошибку: PROGRAM ERROR. 1009

Помогите поправить. Несколько дней уже сижу с ней... тут казалось что уже конец... а нет... не получается.
Просьба: писать сразу код как должно быть чтобы работало... мозги закипают уже

Последний раз редактировалось AnDrOiD73; 21.12.2011 в 19:27.
AnDrOiD73 вне форума Ответить с цитированием
Старый 21.12.2011, 20:21   #2
AnDrOiD73
Пользователь
 
Регистрация: 05.06.2010
Сообщений: 21
По умолчанию

Рабочий вариант, если кому понадобится ниже. У меня было еще неверно то, что список формировался из элементов входящих в заданный диапазон, а надо было: "Для каждого элемента списка найти число вершин, значения которых лежат в определенном диапазоне". И только потом удалять элементы списка на четных позициях.
Код:
domains
tree=nil;t(integer,tree,tree)
tlist=tree*
i=integer
l=integer*
 
predicates
n(tree,integer,integer,integer).
nlist(tlist,l,integer,integer).
deleteodd(l,l).
 
clauses
n(nil,0,_,_).
n(t(H,Left,Right),L,Min,Max):-H < Max, H > Min,!,n(Left,LL,Min,Max),n(Right,LR,Min,Max),L=LL+LR+1.
n(t(_,Left,Right),L,Min,Max):-n(Left,LL,Min,Max),n(Right,LR,Min,Max),L=LL+LR.
 
nlist([],[],_,_).
nlist([Tree|Tail],[L|LTail],Min,Max):-n(Tree,L,Min,Max),nlist(Tail,LTail,Min,Max).
 
deleteodd([],[]).
deleteodd([HH],[HH]).
deleteodd([HH,_|L],[HH|LL]):- deleteodd(L,LL).
 
goal
nlist([t(50,nil,nil),t(10,nil,nil),t(5,t(3,t(7,nil,nil),nil),t(1,t(30,t(15,nil,nil),nil),t(4,nil,nil)))],L,1,40),
write("L=",L),nl,deleteodd(L,IL), write("IL=",IL),nl.
AnDrOiD73 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление элементов из списка. grave123 Общие вопросы C/C++ 0 10.03.2010 15:33
Удаление элементов из списка Wi1D Помощь студентам 0 18.05.2009 00:23
Удаление списка. Пролог. luzerka Помощь студентам 1 13.01.2009 20:31
Упорядочить символьный список по убыванию элементов - язык Пролог yulia Помощь студентам 4 07.10.2007 18:53