Так он правильно выводит... нет никакого цикла... я просто сделал для ориентированного графа. надо 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).