![]() |
|
|
![]()
|
|
| CraZzZyk |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 17.12.2011 Репутация: нет Всего: нет |
Ребят, помогите плиз решить задачку на прологе:
"Внесите изменения в процедуру внутри ( Элемент, Справочник) добавив в нее третий аргумент Путь таким образом, чтобы можно было бы получить путь между корнем справочника и указанным элементом." (плюс к этому препод просит,чтобы дерево выводилось на экран)..в прологе я далеко не очень,поэтому и прошу) Заранее спасибо) |
|||
|
||||
| Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 6 Всего: 49 |
Каким именно образом организован "справочник"?
|
|||
|
||||
| CraZzZyk |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 17.12.2011 Репутация: нет Всего: нет |
Отобразить это дерево(справочник) на экране с помощью процедуры draw, определив предварительно процедуру tab
|
|||
|
||||
| CraZzZyk |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 17.12.2011 Репутация: нет Всего: нет |
(справочник)он же список
|
|||
|
||||
| Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 6 Всего: 49 |
Список не может быть деревом "сам по себе". Либо его элементы также могут быть списками, либо есть какая-то конструкция, называемая "элементом", которая может содержать подсписки. Кстати, "внести изменения в процедуру внутри" можно будет, если Вы покажете неизмененный оригинал. |
|||
|
||||
| CraZzZyk |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 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). |
|||
|
||||
| Фантом |
|
||||||||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 6 Всего: 49 |
М-да. Это, конечно, не совсем Пролог, ну да ладно. Держите искомый предикат, он возвращает список вершин по пути:
Если запустить что-то вроде:
на выходе получится
Если нужна еще и печать, проще соорудить что-то отдельное для печати списка. Например, так:
Соответственно, вызывать со списком, получившимся после отработки первого предиката, в качестве аргумента. |
||||||||
|
|||||||||
| CraZzZyk |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 17.12.2011 Репутация: нет Всего: нет |
программа ругается на Е...((
Добавлено через 4 минуты и 36 секунд которая вот эта внутри(E,t(_,E,_), -> [E]). |
|||
|
||||
| Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 6 Всего: 49 |
Вы это в Turbo/PDC/Visual Ptolog'е гоняли? Если да - предикат описали?
|
|||
|
||||
| CraZzZyk |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 17.12.2011 Репутация: нет Всего: нет |
у нас особый,долбонутый,недоделанный пролог,но предикат я описывал так внутри(integer,tree,item)
|
|||
|
||||
| Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 6 Всего: 49 |
Последний аргумент предиката - список, а не один элемент, отсюда и проблемы. Скорее всего, соответствующий тип описывается как-то вроде integer*, но лучше выясните сами, как там это делается в вашем "особом прологе". |
|||
|
||||
| CraZzZyk |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 17.12.2011 Репутация: нет Всего: нет |
спасибо,похимичу еще сам,но возможно еще отпишу
|
|||
|
||||
| CraZzZyk |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 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). |
|||
|
||||
| Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 6 Всего: 49 |
Проще, наверное, написать нечто отдельное (поиск остановится после обнаружения искомой вершины, он не обязан обходить все дерево). Ну, например, что-то в таком роде:
|
|||
|
||||
| CraZzZyk |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 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, выполняющую табуляцию на заданное число позиций легко определить. Вот ей надо вот эти все как то объединить и сделать про путь( |
|||
|
||||
![]()
|
| Правила форума Prolog | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Prolog | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |