Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу нахождение min и max пути
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Queezi Queezi вне форума
Member
 
Сообщений: 16
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.05.2007
По умолчанию 10.05.2007, 22:36

Код:
domains
  room1=symbol
  steps=integer
  room2=room1*
predicates
  road(room1,room1,steps).
  road1(room1,room1,steps).
  path(room1,room1,steps,room2).
  route(room1,room1,steps).
  member(room1,room2).
  member1(room1,room2).
  path1(room1,room1,steps,room2).
clauses
  road(entry,monsters,100).
  road(entry,fountain,50).
  road(fountain,hell,50).
  road(fountain,mermaid,70).
  road(fountain,robbers,40).
  road(fountain,food,50).
  road(exit,gold,70).
  road(robbers,gold,70).
  road(food,gold,70).
  road(monsters,gold,70).
  road(mermaid,exit,70).
  road1(Room1,Room2,Distance):-
  road(Room1,Room2,Distance);road(Room2,Room1,Distance).

  path(Room1,Room2,Distance,Rooms):-
  road1(Room1,Room2,Distance),not(member(Room2,Rooms)).
  path(Room1,Room2,Distance,Rooms):-
  road1(Room1,X,Dist1),not(member(X,Rooms)),
  path(X,Room2,Dist2,[X|Rooms]),
  Distance=Dist1+Dist2.
  
  path1(Room1,Room2,Distance,Rooms):-
  road1(Room1,Room2,Distance),member1(Room2,Rooms).
  path1(Room1,Room2,Distance,[X]):-
  road1(Room1,X,Dist3),member1(X,Rooms),
  path1(X,Room2,Dist4,[X|Rooms]),
  Distance=Dist3+Dist4.
  route(T1,T2,D):-path(T1,T2,D,[T1]).
  member(X,[X | _]).
  member(X,[_|Y]):-member(X,Y).
  member1(X,[X | _]).
  member1(X,[_|Y]):-member1(X,Y).
Ответить с цитированием
  (#2 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 8,105
Сказал(а) спасибо: 5
Поблагодарили 336 раз(а) в 335 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 11.05.2007, 13:09

Вот Ваше решения для Турбы и вплоть до Vip5.2:
Код:
domains
room1=symbol
steps=integer
room2=room1*
database
minmax(steps,steps)
predicates
nondeterm road(room1,room1,steps).
nondeterm road1(room1,room1,steps).
nondeterm path(room1,room1,steps,room2).
nondeterm route(room1,room1,steps,steps).
nondeterm member(room1,room2).
save_minmax(steps).
goal 
route(entry,exit,Min,Max).
clauses
road(entry,monsters,100).
road(entry,fountain,50).
road(fountain,hell,50).
road(fountain,mermaid,70).
road(fountain,robbers,40).
road(fountain,food,50).
road(exit,gold,70).
road(robbers,gold,70).
road(food,gold,70).
road(monsters,gold,70).
road(mermaid,exit,70).
  
road1(Room1,Room2,Distance):-
  road(Room1,Room2,Distance);road(Room2,Room1,Distance).

path(Room1,Room2,Dist,Rooms):-
  road1(Room1,Room2,Dist1),not(member(Room2,Rooms)),
  D=Dist+Dist1,save_minmax(D).
path(Room1,Room2,Dist,Rooms):-
  road1(Room1,X,Dist1),not(member(X,Rooms)),
  D=Dist+Dist1,path(X,Room2,D,[X|Rooms]).
  
route(T1,T2,Min,Max):-path(T1,T2,0,[T1]),fail;minmax(Min,Max).

save_minmax(D):-
  minmax(Min,Max),D<Min,retract(minmax(Min,Max)),assert(minmax(D,Max)),!;
  minmax(Min,Max),D>Max,retract(minmax(Min,Max)),assert(minmax(Min,D)),!;
  minmax(Min,Max),D>=Min,D<=Max,!;
  assert(minmax(D,D)).

member(X,[X|_]).
member(X,[_|Y]):-member(X,Y).
Кстати, у Вас в проге было много лишних предикатов.
Ответить с цитированием
  (#3 (permalink)) Старый
Queezi Queezi вне форума
Member
 
Сообщений: 16
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.05.2007
По умолчанию 11.05.2007, 17:16

Цитата:
Вот Ваше решения для Турбы и вплоть до Vip5.2:
<div class='codetop'>Код Prolog
<div class='codemain'>domains
room1=symbol
steps=integer
room2=room1*
database
minmax(steps,steps)
predicates
nondeterm road(room1,room1,steps).
nondeterm road1(room1,room1,steps).
nondeterm path(room1,room1,steps,room2).
nondeterm route(room1,room1,steps,steps).
nondeterm member(room1,room2).
save_minmax(steps).
goal
route(entry,exit,Min,Max).
clauses
road(entry,monsters,100).
road(entry,fountain,50).
road(fountain,hell,50).
road(fountain,mermaid,70).
road(fountain,robbers,40).
road(fountain,food,50).
road(exit,gold,70).
road(robbers,gold,70).
road(food,gold,70).
road(monsters,gold,70).
road(mermaid,exit,70).

road1(Room1,Room2,Distance):-
road(Room1,Room2,Distance);road(Room2,Room1,Distance).

path(Room1,Room2,Dist,Rooms):-
road1(Room1,Room2,Dist1),not(member(Room2,Rooms)),
D=Dist+Dist1,save_minmax(D).
path(Room1,Room2,Dist,Rooms):-
road1(Room1,X,Dist1),not(member(X,Rooms)),
D=Dist+Dist1,path(X,Room2,D,[X|Rooms]).

route(T1,T2,Min,Max):-path(T1,T2,0,[T1]),fail;minmax(Min,Max).

save_minmax(D):-
minmax(Min,Max),D<Min,retract(minmax(Min,Max)),assert(minmax(D,Max)),!;
minmax(Min,Max),D>Max,retract(minmax(Min,Max)),assert(minmax(Min,D)),!;
minmax(Min,Max),D>=Min,D<=Max,!;
assert(minmax(D,D)).

member(X,[X|_]).
member(X,[_|Y]):-member(X,Y).[/code]
Кстати, у Вас в проге было много лишних предикатов.[/quote]
Спасибо, что согласились мне помочь, но только что то программка не работает, ошибок ни каких не выдает, просто не запускается, в окне Dialog требуется нажать Space Bar, после чего окно диалога закрывается, в чем причина? Пишу на Турбо Прологе...

и еще, что такое nondeterm? может в этом причина? до этого такой тип предиката не использовал...
Ответить с цитированием
  (#4 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,795
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 11.05.2007, 17:55

Напишите в goal явный вывод переменных с помощью write.
nondeterm - недетерминированный предикат. Читайте, пожалуйста, документацию.
Ответить с цитированием
  (#5 (permalink)) Старый
Queezi Queezi вне форума
Member
 
Сообщений: 16
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.05.2007
По умолчанию 11.05.2007, 21:44

да я бы прочитал, и за вашей помощью не обратился бы, вот только ни какой документации, ни каких книг, ни чего, кроме непосредственно задания, нам не предоставляют...
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 8,105
Сказал(а) спасибо: 5
Поблагодарили 336 раз(а) в 335 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 12.05.2007, 13:42

Код:
domains
room1=symbol
steps=integer
room2=room1*
database
minmax(steps,steps)
predicates
nondeterm road(room1,room1,steps).
nondeterm road1(room1,room1,steps).
nondeterm path(room1,room1,steps,room2).
nondeterm route(room1,room1,steps,steps).
nondeterm member(room1,room2).
save_minmax(steps).
goal 
route(entry,exit,Min,Max),write(Min," ",Max).
clauses
road(entry,monsters,100).
road(entry,fountain,50).
road(fountain,hell,50).
road(fountain,mermaid,70).
road(fountain,robbers,40).
road(fountain,food,50).
road(exit,gold,70).
road(robbers,gold,70).
road(food,gold,70).
road(monsters,gold,70).
road(mermaid,exit,70).
  
road1(Room1,Room2,Distance):-
  road(Room1,Room2,Distance);road(Room2,Room1,Distance).

path(Room1,Room2,Dist,Rooms):-
  road1(Room1,Room2,Dist1),not(member(Room2,Rooms)),
  D=Dist+Dist1,save_minmax(D).
path(Room1,Room2,Dist,Rooms):-
  road1(Room1,X,Dist1),not(member(X,Rooms)),
  D=Dist+Dist1,path(X,Room2,D,[X|Rooms]).
  
route(T1,T2,Min,Max):-path(T1,T2,0,[T1]),fail;minmax(Min,Max).

save_minmax(D):-
  minmax(Min,Max),D<Min,retract(minmax(Min,Max)),assert(minmax(D,
Max)),!;
  minmax(Min,Max),D>Max,retract(minmax(Min,Max)),assert(minmax(Min
,D)),!;
  minmax(Min,Max),D>=Min,D<=Max,!;
  assert(minmax(D,D)).

member(X,[X|_]).
member(X,[_|Y]):-member(X,Y).
Ответить с цитированием
  (#7 (permalink)) Старый
Queezi Queezi вне форума
Member
 
Сообщений: 16
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.05.2007
По умолчанию 13.05.2007, 14:56

для того что бы узнать какой путь минимальный или максимальный, надо ввести запрос, например с какой в какую комнату существует тот или иной путь, и через какие комнаты он его проходит, и какой из этих путей является минимальным или максимальным....а в вашем решении, сразу выводится общая минимальная и максимальная сумма, а какого пути не понятно....
Ответить с цитированием
  (#8 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 8,105
Сказал(а) спасибо: 5
Поблагодарили 336 раз(а) в 335 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 13.05.2007, 16:27

Вы сами не привели постановку задачи: что на входе, что на выходе.
Минимальный и максимальный путь вывести очень легко, для этого требуются имнимальные переделки проги. А вот задание начала и конца пути можно делать в самой цели. Попробуйте уж сами.
Ответить с цитированием
  (#9 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 8,105
Сказал(а) спасибо: 5
Поблагодарили 336 раз(а) в 335 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 13.05.2007, 17:08

Код:
domains
path=symbol*
database
minmax(path,integer,path,integer)
predicates
nondeterm road(symbol,symbol,integer).
nondeterm road1(symbol,symbol,integer).
nondeterm path(symbol,symbol,integer,path).
nondeterm route(symbol,symbol,path,integer,path,integer).
nondeterm member(symbol,path).
save_minmax(path,integer).
goal
write("From: "),readln(X),
write("To: "),readln(Y),
route(X,Y,Pathmin,Min,Pathmax,Max),
write(Pathmin,"=",Min,"\n",Pathmax,"=",Max),exit.
clauses
road(entry,monsters,100).
road(entry,fountain,50).
road(fountain,hell,50).
road(fountain,mermaid,70).
road(fountain,robbers,40).
road(fountain,food,50).
road(exit,gold,70).
road(robbers,gold,70).
road(food,gold,70).
road(monsters,gold,70).
road(mermaid,exit,70).
  
road1(X,Y,D):-road(X,Y,D);road(Y,X,D).

path(X,Y,D,Path):-
  road1(X,Y,D1),not(member(Y,Path)),
  D2=D+D1,save_minmax([Y|Path],D2).
path(X,Y,D,Path):-
  road1(X,Z,D1),not(member(Z,Path)),
  D2=D+D1,path(Z,Y,D2,[Z|Path]).
  
route(X,Y,Pathmin,Min,Pathmax,Max):-path(X,Y,0,[X]),fail;
   minmax(Pathmin,Min,Pathmax,Max).

save_minmax(Path,D):-
  minmax(Pathmin,Min,Pathmax,Max),D<Min,
  retract(minmax(Pathmin,Min,Pathmax,Max)),
  assert(minmax(Path,D,Pathmax,Max)),!;
  minmax(Pathmin,Min,Pathmax,Max),D>Max,
  retract(minmax(Pathmin,Min,Pathmax,Max)),
  assert(minmax(Pathmin,Min,Path,D)),!;
  minmax(_,Min,_,Max),D>=Min,D<=Max,!;
  assert(minmax(Path,D,Path,D)).

member(X,[X|_]).
member(X,[_|L]):-member(X,L).
Ответить с цитированием
  (#10 (permalink)) Старый
Queezi Queezi вне форума
Member
 
Сообщений: 16
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.05.2007
По умолчанию 14.05.2007, 14:44

немножко не так делается запрос...например: компилирую, в окне появляется "цель:", я пишу запрос, path(entry,hell,X), нажимаю "enter", выводится решение, расстояние и через какие комнаты надо пройти, в таком же духе надо сделать что бы он нашел максимальный путь из комнаты в комнату или минимальный, по отдельности, по моему заданию того или иного....
Ответить с цитированием
  (#11 (permalink)) Старый
Queezi Queezi вне форума
Member
 
Сообщений: 16
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.05.2007
По умолчанию 16.05.2007, 21:17

Спасибо вам за помощь! программка работает!
Ответить с цитированием
  (#12 (permalink)) Старый
Define Define вне форума
Member
 
Сообщений: 16
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.02.2011
По умолчанию 13.03.2011, 00:31

скажите пожалуйста,а как можно переделать прогу так,чтобы просто определялось существуют пути от одной заданной вершины графа к другой?
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
Define Define вне форума
Member
 
Сообщений: 16
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.02.2011
По умолчанию 25.04.2011, 22:19

пожалуйста,скиньте текст программы на visual prolog 5.2. у меня выдает ошибку ключевого слова,плиз,помогите разобраться что к чему?
Ответить с цитированием
Ads
Ответ

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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нахождение длины пути до элемента в бинарном дереве Mozikoff Prolog 6 16.10.2011 14:38
Длина пути kort87 Prolog 3 06.10.2011 14:21
Нахождение кротчайшего пути в метро Shhh Haskell 1 09.05.2011 15:07
пути в графах Define Prolog 3 25.04.2011 22:32
Нахождение пути в лабиринте SergAnt007 Prolog 7 27.03.2011 22:21
Нахождение самого длинного пути с вводом значений dyalex86 Prolog 1 18.10.2010 14:19
Нахождение самого длинного пути поиском в ширину. SWI Prolog Asaumi Prolog 2 03.10.2010 14:43
Нахождение кратчайшего пути в графе Татаnt Prolog 11 27.05.2010 23:33
Нахождение пути между двумя узлами дерева Borg Prolog 2 01.11.2008 01:31
Нахождение эйлерова пути на Прологе sonechka Prolog 1 06.12.2007 19:30
Пути в графе Isav Prolog 1 24.09.2007 15:25
Пути на графах linux Prolog 2 12.12.2004 10:30



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