For the multidirected graph below I am trying to write an program that visits all edges at least once. For instance, in the below graph I am looking for an outcome similar to "edge(1,2), edge(2,3), edge(3,1), edge(1,2), edge(2,4), edge(4,5), edge(5,4), edge(4,3), edge(3,1)"
Here is my code so far. It does not run properly, but I do not know how to fix it.Could you please assist on how to continue? Any advice or code is welcome.
Basically, I believe I am looking for a variation of an Eulerian Cycle where the edges can be visited more than once.
edge(1,2). edge(2,3). edge(3,1).
edge(2,4). edge(4,3).
edge(4,5). edge(5,4).
#const s=1.
start(s).
time(1..20). % allow at most 20 time-steps
1 { move(edge(X,Y),step(T)) : edge(X,Y) } 1 :- time(T).
:- move(edge(X,Y),step(1)), edge(X,Y), X!=s. % start from s
:- move(edge(X,Y_1),step(T)), move(edge(Y_2,Y),step(TT)), TT=T+1, Y_1!=Y_2.
visited(X,Y,T) :- time(T),move(edge(X,Y),step(S)), S<T, T<=20.
visited(X,Y,T) :- time(T),move(edge(Y,X),step(S)), S<T, T<=20.
:- edge(X,Y), not visited(X,Y,20).
:- move(edge(X,Y),step(S)), S<=20, Y!=s. %ensures path is cycle (back to s)
#minimize { T : time(T) }. % here i try to get as many steps as possible out of the upper bound of 20
#show move/2.