Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Упростить программу
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
lollipop lollipop вне форума
Member
 
Сообщений: 19
Сказал(а) спасибо: 2
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 05.10.2011
Post Упростить программу - 17.10.2011, 23:24

Всем привет! Есть программа - Задание: определить длину (число ветвей) пути от корня дерева до ближайшей вершины с заданным значением, если такая вершина отсутствует, ответ- "-1"
Вот код:

Visual Prolog Код:
domains
    list=integer*.
    tree=der(tree,integer,tree);
    nil.   
predicates
        inside(integer,tree,list).
    add(list).
    derevo(list,tree,integer,list).
    create_kor_der(list,tree).
    konk(list,list,list).
    dobav(tree,integer,tree).
    del(list,list).
    count(list,integer,integer).        
clauses
    add([H|T]):-readint(H),H<>0,add(T),!.
    add([]).
    del([_|T],T).
    konk([],L,L).
    konk([X|L1],L2,[X|L3]):-konk(L1,L2,L3).
    dobav(nil,X,der(nil,X,nil)).
    dobav(der(L,X,R),X,der(L,X,R)).
    dobav(der(L,Kor,R),X,der(L1,Kor,R)):-
        Kor>=X,
        dobav(L,X,L1).
    dobav(der(L,Kor,R),X,der(L,Kor,R1)):-
        X>Kor,
        dobav(R,X,R1).
    create_kor_der([H1|_],T1):-
        dobav(nil,H1,T1).
    inside(X,der(_,X,_),[X]).
    inside(X,der(L,Kor,_),[Kor|Put]):-
        Kor>X,
        inside(X,L,Put).
    inside(X,der(_,Kor,R),[Kor|Put]):-
        X>Kor,
        inside(X,R,Put).       
    count([_|T],N,NN):-N1=N+1,count(T,N1,NN).
    count([],N,N)
    derevo([H1|T1],Tr,E,Spisok):-
        H1=0,
        inside(E,Tr,Spisok);
        H1<>0,
        dobav(Tr,H1,Tr1),
        derevo(T1,Tr1,E,Spisok).
goal
    clearwindow,  
    write("Enter Tree:\n"),
    add(L),
    write(L),nl,
    konk(L,[0],L1),  
    create_kor_der(L1,T),    
    del(L1,L2),
    write("Enter Element:\n"),
    readint(E),
    derevo(L2,T,E,Spi),
    N=-1,
    count(Spi,N,NN),
    write("dlina min puti = ",NN);
    write("element ne naiden!").

Помогите пожалуйста переделать прогу, так чтобы эллементы дерева ввести непосредственно в коде, а не с клавиатуры (5-6 эллементов), дело в том что преподаватель очень жестко спрашивает по коду, а так половина проги срезается. Заранее благодарю всех. Счастливо!
Ответить с цитированием
  (#2 (permalink)) Старый
Alexiski Alexiski вне форума
Любитель давать советы
 
Сообщений: 4,266
Сказал(а) спасибо: 27
Поблагодарили 54 раз(а) в 54 сообщениях
Регистрация: 16.10.2005
По умолчанию 18.10.2011, 08:11

Как-то так:
Visual Prolog Код:
domains
    list=integer*.
    tree=der(tree,integer,tree);
    nil.    
predicates
    inside(integer,tree,list).
    count(list,integer,integer).        
clauses
    inside(X,der(_,X,_),[X]).
    inside(X,der(L,Kor,_),[Kor|Put]):-
        Kor>X,
        inside(X,L,Put).
    inside(X,der(_,Kor,R),[Kor|Put]):-
        X>Kor,
        inside(X,R,Put).        
    count([_|T],N,NN):-N1=N+1,count(T,N1,NN).
    count([],N,N).  
goal
    clearwindow,  
    write("Enter Element:\n"),
    readint(E),
    inside(E,der(der(der(nil,1,nil),2,nil),3,der(der(nil,4,nil),5,nil)),Spi),
    N=-1,
    count(Spi,N,NN),
    write("dlina min puti = ",NN);
    write("element ne naiden!").
Весь ввод и формирование дерева выкинул, но всё равно избыточно: можно считать длину пути сразу, не формируя сам путь
Ответить с цитированием
  (#3 (permalink)) Старый
lollipop lollipop вне форума
Member
 
Сообщений: 19
Сказал(а) спасибо: 2
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 05.10.2011
По умолчанию 18.10.2011, 11:22

Спасибо большое ты меня очень выручил!!!
Ответить с цитированием
  (#4 (permalink)) Старый
lollipop lollipop вне форума
Member
 
Сообщений: 19
Сказал(а) спасибо: 2
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 05.10.2011
По умолчанию 30.10.2011, 13:20

Alexiski, а ты не можешь переделать прогу чтобы дерево было неупорядоченным, т.е заданная вершина может сколь угодно встречаться в дереве и как нам сказал преподаватель мы должны сначала пройтись по всему дереву, и выбрать наименьший путь из всех встреченных нами заданных вершин??? Буду очень благодарен.
Ответить с цитированием
  (#5 (permalink)) Старый
aag aag вне форума
ушёл... не вернётся)))
 
Сообщений: 3,400
Сказал(а) спасибо: 0
Поблагодарили 82 раз(а) в 82 сообщениях
Регистрация: 29.11.2008
По умолчанию 30.10.2011, 14:34

В ширину по-тупонькому:

prolog Код:
DOMAINS
i=integer    
tree=tree(integer,tree,tree); nil
treeL=tree*
%
CONSTANTS
tr=tree(44,tree(25,tree(28,tree(13,tree(13,tree(24,tree(9,nil,nil),tree(11,nil,nil)),tree(31,tree(31,nil,nil),nil)),tree(49,tree(1,tree(3,nil,nil),nil),tree(48,tree(44,nil,nil),nil))),tree(14,tree(6,tree(43,tree(47,nil,nil),tree(37,nil,nil)),tree(22,tree(32,nil,nil),nil)),tree(26,tree(12,tree(35,nil,nil),nil),tree(43,tree(25,nil,nil),nil)))),tree(48,tree(30,tree(7,tree(4,tree(16,nil,nil),tree(18,nil,nil)),tree(34,tree(26,nil,nil),nil)),tree(46,tree(44,tree(21,nil,nil),nil),tree(19,tree(43,nil,nil),nil))),tree(16,tree(42,tree(40,tree(45,nil,nil),nil),tree(0,tree(38,nil,nil),nil)),tree(5,tree(12,tree(7,nil,nil),nil),tree(41,tree(6,nil,nil),nil))))),tree(24,tree(38,tree(11,tree(18,tree(11,tree(1,nil,nil),tree(33,nil,nil)),tree(46,tree(1,nil,nil),nil)),tree(32,tree(49,tree(35,nil,nil),nil),tree(48,tree(0,nil,nil),nil))),tree(45,tree(12,tree(25,tree(16,nil,nil),nil),tree(22,tree(46,nil,nil),nil)),tree(24,tree(35,tree(9,nil,nil),nil),tree(6,tree(6,nil,nil),nil)))),tree(13,tree(3,tree(49,tree(49,tree(22,nil,nil),tree(29,nil,nil)),tree(21,tree(30,nil,nil),nil)),tree(35,tree(9,tree(20,nil,nil),nil),tree(31,tree(21,nil,nil),nil))),tree(36,tree(43,tree(1,tree(10,nil,nil),nil),tree(23,tree(30,nil,nil),nil)),tree(24,tree(20,tree(18,nil,nil),nil),tree(17,tree(31,nil,nil),nil))))))
%
PREDICATES
length(integer,integer)
find(integer,treeL,integer,integer)
next(treeL,tree)
get(tree,tree)
member(tree,treeL)
%
CLAUSES
%
length(A,B):- find(A,[tr],0,B), !.
length(_,-1).
%
find(A,B,C,C):- member(tree(A,_,_),B), !.
find(A,B,C,D):- not(B=[]), findAll(E,next(B,E),F), G=C+1, find(A,F,G,D).
%
next(A,B):- member(C,A), get(C,B).
%
get(tree(_,A,_),A):- not(A=nil).
get(tree(_,_,A),A):- not(A=nil).
%
member(A,[A|_]).
member(A,[_|B]):- member(A,B).


prolog Код:
Goal: length(0,Len)
Len=5
1 Solution
Goal: length(1,Len)
Len=5
1 Solution
Goal: length(2,Len)
Len=-1
1 Solution
Goal: length(3,Len)
Len=3
1 Solution
Goal: length(5,Len)
Len=4
1 Solution

Дерево бинарное. На произвольное заточить без проблем.
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
lollipop lollipop вне форума
Member
 
Сообщений: 19
Сказал(а) спасибо: 2
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 05.10.2011
По умолчанию 31.10.2011, 14:06

Заточишь произвольное?
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как защитить программу SanSey Delphi 11 31.10.2011 11:54
программу взломать grh1 Задания за деньги 0 24.10.2011 21:47
Составить программу andreis459 Вопросы начинающих программистов 0 18.03.2011 22:53
Подскажите программу.... niceguy Софт 1 15.01.2011 15:28
Как упростить? shor Prolog 10 29.11.2009 20:51
Как написать TSR программу в С++ kosetsky Вопросы начинающих программистов 1 03.10.2009 21:25
Написать программу blackcat Задания за деньги 3 20.09.2009 12:12
Ищу программу sos112 Софт и программы 10 12.08.2007 16:53
Ищу программу AON Pro 5.4 cybernet1 Софт и программы 9 07.05.2007 15:04
Куплю программу Anonymous Работа 0 23.12.2004 01:40
Регулярные выражения: как упростить? feedbee PHP 5 08.08.2004 00:48
Написать программу которая закрывает любую программу из автозагрузки без перезагрузк Anonymous C++ Builder 1 07.10.2003 11:24



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов