IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Гамильтонов цикл на Prolog, Гамильтонов цикл на Prolog
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 100
Пол: Мужской

Репутация: -  0  +


Доброго всем времени суток. Помогите разобраться с задачей: "определение цикла Гамильтона в заданном графе". Язык prolog. Какой может быть алгоритм, где можно об этом попонятней почитать? Может есть уже готовая))) На pascalе бы быстро все сделал, а вот с логическим программированием пока проблемы.

Заранее огромное спасибо.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Пионер
**

Группа: Пользователи
Сообщений: 100
Пол: Мужской

Репутация: -  0  +


Так он правильно выводит... нет никакого цикла... я просто сделал для ориентированного графа. надо rebro(1,2) и rebro(2,1) - не одно и тоже.

Вот исправленная программа, вроде все работает, как мне кажется(тоже с ориентированными):

Код

domains
  top=symbol
  Vlist=top*
  rebro=rebro(top,top)
  Rlist=rebro*
  gr=graf(Vlist,Rlist)
predicates
    /*put' ot odnoy vershini do drugoy*/
  path(top,top,Vlist,Vlist,gr)
    /*prinadlezhit li vershina spisku vershin*/
  memberV(top,Vlist)
    /*prinadlezhit li rebro spisku reber*/
  memberR(rebro,Rlist)
    /*gamiltonov cikl*/
  gamil(gr,Vlist)
    /*vse li vershini proydeni*/
  allV(Vlist,Vlist)
  
clauses
  gamil(G,P):-
    G=graf(Vlist,Rlist),
    P=[A|V],
    path(A,B,[A],V,G),
    memberR(rebro(B,A),Rlist),
    allV(Vlist,V).    

  path(A,B,V,[B|V],graf(Vlist,Rlist)):-
    memberR(rebro(A,B),Rlist),
    not(memberV(B,V)).
  path(A,B,V,V2,graf(Vlist,Rlist)):-
    memberR(rebro(A,N),Rlist),
    not(memberV(N,V)),
    V1=[N|V],
    path(N,B,V1,V2,graf(Vlist,Rlist)).

  allV([],L).
  allV([X|T],L):-
    memberV(X,L),
    allV(T,L).

  memberV(A, [A|_]).
  memberV(A, [_|L]):-memberV(A,L).
  
  memberR(A, [A|_]).
  memberR(A, [_|L]):-memberR(A,L).
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Цитата(kosyak @ 3.11.2008 19:00) *

Так он правильно выводит... нет никакого цикла... я просто сделал для ориентированного графа. надо rebro(1,2) и rebro(2,1) - не одно и тоже.

Вот исправленная программа, вроде все работает, как мне кажется(тоже с ориентированными):

Код

domains
  top=symbol
  Vlist=top*
  rebro=rebro(top,top)
  Rlist=rebro*
  gr=graf(Vlist,Rlist)
predicates
    /*put' ot odnoy vershini do drugoy*/
  path(top,top,Vlist,Vlist,gr)
    /*prinadlezhit li vershina spisku vershin*/
  memberV(top,Vlist)
    /*prinadlezhit li rebro spisku reber*/
  memberR(rebro,Rlist)
    /*gamiltonov cikl*/
  gamil(gr,Vlist)
    /*vse li vershini proydeni*/
  allV(Vlist,Vlist)
  
clauses
  gamil(G,P):-
    G=graf(Vlist,Rlist),
    P=[A|V],
    path(A,B,[A],V,G),
    memberR(rebro(B,A),Rlist),
    allV(Vlist,V).    

  path(A,B,V,[B|V],graf(Vlist,Rlist)):-
    memberR(rebro(A,B),Rlist),
    not(memberV(B,V)).
  path(A,B,V,V2,graf(Vlist,Rlist)):-
    memberR(rebro(A,N),Rlist),
    not(memberV(N,V)),
    V1=[N|V],
    path(N,B,V1,V2,graf(Vlist,Rlist)).

  allV([],L).
  allV([X|T],L):-
    memberV(X,L),
    allV(T,L).

  memberV(A, [A|_]).
  memberV(A, [_|L]):-memberV(A,L).
  
  memberR(A, [A|_]).
  memberR(A, [_|L]):-memberR(A,L).


а никак нельзя код под SWI посмотреть? оч нужно
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 20.04.2024 1:23
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name