Search code examples
prolog

Print an Eulerian path of graph


I am completely new to Prolog, but I have to do this for a homework. At the entry is given a undirected coherent graph. Write a program in Prolog, which prints euler circle of this graph. Thanks for answers. For example i have this edge:

edge(a,b).
edge(b,e).
edge(a,c).
edge(c,d).
edge(e,d).

Solution

  • This is an Eulerian path ; not necessarily a circle.

    eulerpath(E, Cs) :-
       setof(A-B, call(E, A,B), ABs),
       edges_path(ABs, Cs).
    
    edges_path([], [_]).
    edges_path(ABs0, [X,Y|Xs]) :-
        select(A-B,ABs0,ABs),
        ( A = X, B = Y ; B = X, A = Y ),
        edges_path(ABs, [Y|Xs]).
      
    ?- eulerpath(edge, Cs).
       Cs = [a,b,e,d,c,a]
    ;  Cs = [b,a,c,d,e,b]
    ;  Cs = [a,c,d,e,b,a]
    ;  Cs = [c,a,b,e,d,c]
    ;  Cs = [b,e,d,c,a,b]
    ;  Cs = [e,b,a,c,d,e]
    ;  Cs = [c,d,e,b,a,c]
    ;  Cs = [d,c,a,b,e,d]
    ;  Cs = [e,d,c,a,b,e]
    ;  Cs = [d,e,b,a,c,d]
    ;  false.