
cost(a,b,1). cost(b,a,1).  cost(b,c,1). cost(c,b,1).
cost(c,a,2). cost(a,c,2).

member(X,[X|Y]).
member(X,[Y|Z]) :- X \= Y -> member(X,Z).

remove(X,[X|Y], Y).
remove(X,[Y|Z], [Y|W]) :- X \= Y -> remove(X,Z,W).

paths(X,Cost,Route) :- remove(X,[a,b,c], Restlist) -> paths2(X, 0, 2, 0, Cost, Route, Restlist,X).

paths2(X, Maxlen, Maxlen, CurCost, Cost, [First], [], First) :- 
	   cost(X,First,C1) -> 
	   Cost is CurCost + C1.

paths2(X, Clen, Maxlen, CurCost, Cost, Route, Unused, First) :- 
           Clen < Maxlen ->
           cost(X, Y, C) ->
	   member(Y,Unused) ->  
           remove(Y,Unused,NewUnused) ->
           NCost is CurCost+C -> Clen1 is Clen+1 -> Route = [Y|RestRoute] ->
           paths2(Y,Clen1,Maxlen,NCost,Cost,RestRoute,NewUnused,First).

                                            
/* ?-  paths2(a, 0, 2, 0, Cost, Route, [b,c] ,a). */

?- Rest = [a,b,c], Route = [a|Rest].
