Поиск:

Ответ в темуСоздание новой темы Создание опроса
> деревья в прологе, поиск пути к элементу 
:(
    Опции темы
CraZzZyk
Дата 17.12.2011, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ребят, помогите плиз решить задачку на прологе:
"Внесите изменения в процедуру внутри ( Элемент, Справочник)  добавив в нее третий аргумент Путь таким образом, чтобы можно было бы получить путь между корнем справочника и указанным элементом." (плюс к этому препод просит,чтобы дерево выводилось на экран)..в прологе я далеко не очень,поэтому и прошу)
Заранее спасибо)
PM MAIL   Вверх
Фантом
Дата 17.12.2011, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


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

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



Каким именно образом организован "справочник"?
PM   Вверх
CraZzZyk
Дата 17.12.2011, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Отобразить это дерево(справочник) на экране с помощью процедуры draw, определив предварительно процедуру tab
PM MAIL   Вверх
CraZzZyk
Дата 18.12.2011, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



(справочник)он же список
PM MAIL   Вверх
Фантом
Дата 18.12.2011, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


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

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



Цитата(CraZzZyk @  18.12.2011,  13:06 Найти цитируемый пост)
(справочник)он же список 

Список не может быть деревом "сам по себе". Либо его элементы также могут быть списками, либо есть какая-то конструкция, называемая "элементом", которая может содержать подсписки. Кстати, "внести изменения в процедуру внутри" можно будет, если Вы покажете неизмененный оригинал.
PM   Вверх
CraZzZyk
Дата 19.12.2011, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



препод ничего нам не дала изначально,поэтому предлагалось писать сначала,но одногруппница сделала кое что и выглядит это так:

DOMAINS
  item=integer
  tree=t(tree,item,tree); e
PREDICATES
  tab(integer)
  add(item,tree,tree)
  draw(tree)
  draw2(tree,integer)
  min(tree,item)
CLAUSES
  tab(0).
  tab(X):-
    write(" "),tab(Y),X=Y+1.
  draw(X)
    :-draw2(X,0).
  add(X,e,t(e,X,e)).
  add(X,t(L,X,R),t(L,X,R)).
  add(X,t(L,Y,R),t(L1,Y,R)):-
    X<Y,add(X,L,L1).
  add(X,t(L,Y,R),t(L,Y,R1)):-
    X>Y,add(X,R,R1).
  draw2(e,_).
  draw2(t(L,X,R),T):-
    T2=T+2,draw2(R,T2),tab(T),write(X),nl,draw2(L,T2).

PM MAIL   Вверх
Фантом
Дата 19.12.2011, 01:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


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

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



М-да. Это, конечно, не совсем Пролог, ну да ладно. Держите искомый предикат, он возвращает список вершин по пути:
Код

внутри(_,[],_):-fail.
внутри(E,t(_,E,_),[E]).
внутри(E,t(L,F,_),[F|W]):-внутри(E,L,W).
внутри(E,t(_,F,R),[F|W]):-внутри(E,R,W).


Если запустить что-то вроде:
Код

внутри(5,t(t([],3,[]),2,t(t([],1,t([],5,[])),4,[])),W).

на выходе получится
Код

W = [2, 4, 1, 5] .


Если нужна еще и печать, проще соорудить что-то отдельное для печати списка. Например, так:
Код

печать([]):-nl.
печать([H|T]):-write(H),write(' '),печать(T).

Соответственно, вызывать со списком, получившимся после отработки первого предиката, в качестве аргумента.
PM   Вверх
CraZzZyk
Дата 19.12.2011, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



программа ругается на Е...((

Добавлено через 4 минуты и 36 секунд
которая вот эта     внутри(E,t(_,E,_), ->  [E]).
PM MAIL   Вверх
Фантом
Дата 19.12.2011, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


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

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



Вы это в Turbo/PDC/Visual Ptolog'е гоняли? Если да - предикат описали?
PM   Вверх
CraZzZyk
Дата 19.12.2011, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



у нас особый,долбонутый,недоделанный пролог,но предикат я описывал так внутри(integer,tree,item)
PM MAIL   Вверх
Фантом
Дата 19.12.2011, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


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

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



Цитата(CraZzZyk @  19.12.2011,  23:44 Найти цитируемый пост)
у нас особый,долбонутый,недоделанный пролог,но предикат я описывал так внутри(integer,tree,item) 

Последний аргумент предиката - список, а не один элемент, отсюда и проблемы. Скорее всего, соответствующий тип описывается как-то вроде integer*, но лучше выясните сами, как там это делается в вашем "особом прологе".
PM   Вверх
CraZzZyk
Дата 19.12.2011, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



спасибо,похимичу еще сам,но возможно еще отпишу
PM MAIL   Вверх
CraZzZyk
Дата 22.12.2011, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



а можно вот этот код добить так,чтобы на экране показывалось и само дерево?

domains
        list=integer*.
        tree=d(integer,tree,tree);
        e.
predicates
    search(integer,tree,list).
clauses
    search(_,e,_):-fail.
    search(N,d(N,_,_),[N]).
    search(N,d(M,A,_),[M|L]):-search(N,A,L).
    search(N,d(M,_,A),[M|L]):-search(N,A,L).
goal: search(7,d(1,d(2,d(3,e,e),d(5,e,e)),d(6,d(7,e,e),d(8,e,e))),N).

PM MAIL   Вверх
Фантом
Дата 23.12.2011, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


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

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



Проще, наверное, написать нечто отдельное (поиск остановится после обнаружения искомой вершины, он не обязан обходить все дерево). Ну, например, что-то в таком роде:
Код

view(d(M,A,B)):-write(M),nl,views(1,A),views(1,B).
    
views(N,e):-printspace(N),write('X'),nl.
views(N,d(M,A,B)):-printspace(N),write(M),nl,Nn is N+1,views(Nn,A),views(Nn,B).
    
printspace(1):-write('|-').
printspace(N):-write('  '),Nn is N-1,printspace(Nn).


PM   Вверх
CraZzZyk
Дата 23.12.2011, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



послала она меня нафиг((все сначала,б....

Добавлено через 4 минуты и 15 секунд
                              внутри ( Х, tree ( _, Х, _ ) ).
                              внутри ( Х, tree ( L, _, _ ) ) :- внутри ( X, L).
                              внутри ( Х, tree ( _, _, R) ) :- внутри ( Х, R).

внутри ( X, tree ( _, X, _ )).
внутри ( X, tree ( Лев, Корень, Прав )):-
    больше ( Корень, Х ),        % Корень больше, чем Х
              внутри ( X, Лев ).            % Поиск в левом поддереве

внутри ( X, tree ( Лев, Корень, Прав )):-
    больше ( Х, Корень ),        % Х больше, чем корень
              внутри ( X, Прав ).            % Поиск в правом поддереве


доб_лист ( empty, Х, tree ( empty, Х, empty ) ).
доб_лист ( tree ( Лев, Х, Прав ), Х, tree ( Лев, Х, Прав ) ).

доб_лист ( tree ( Лев, Кор, Прав ), Х, tree ( Лев1, Кор, Прав )): — 
                  больше ( Кор, Х ),
                 доб_лист ( Лев, Х, Лев1 ).
доб_лис ( tree ( Лев, Кор, Прав ), Х, tree ( Лев, Кор, Прав1 )):-
                 больше ( Х, Кор ),
                 доб_лист ( Прав, Х, Прав1 ).

Определим процедуру
draw ( Т)
так, чтобы она отображала дерево в форме, показан¬ной на рис. 7. Принцип работы этой процедуры:
Для того, чтобы отобразить непустое дерево Т, необходимо:
(1)    отобразить правое поддерево дерева отступом вправо на расстояние Н;
(2)    отпечатать корень дерева Т;
(3)    отобразить левое поддерево дерева Т отступом вправо на расстояние Н.

Величина отступа Н, которую можно выбирать по же¬ланию, — это дополнительный параметр при отображе¬нии деревьев. Введем процедуру

draw2( Т, Н)

печатающую дерево Т с отступом на Н пробелов от левого края листа. Связь между процедурами draw  и  draw2  такова: 

draw ( Т) :— draw2( Т, 0).
Программа отображения имеет вид: (в этой программе предусмотрен сдвиг на 2 позиции для каж-дого уровня дерева )

    draw ( Т):- draw2 ( Т, 0 ).

draw2 ( empty, _ ).
draw2 ( tree ( L, X, R ), Oтcтyп ):-
            Отступ2 = Отступ + 2, 
            draw2 ( R, Отступ2 ), 
            tab ( Отступ), write( X), nl, 
        draw2 ( L, Отступ2).

В программе использован встроенный оператор nl – перевод строки. Процедуру tab, выполняющую табуляцию на заданное число позиций легко определить.

Вот ей надо вот эти все как то объединить и сделать про путь(
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума Prolog
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

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

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


 




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


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

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