:- use_module(library(lists), [reverse/2, last/2]). exchange(List,Value) :- setof(Value,values(List,Value),AllValues), last(AllValues,Value). values(List,Value) :- swap(List,LSwapped), value(LSwapped,Value). swap([],[]). swap([A|R],[A|RestOut]) :- swap(R,RestOut). swap([A,B|R],Out) :- reverse_int(A,ARev), reverse_int(B,BRev), Out = [BRev,ARev|RestOut], swap(R,RestOut). reverse_int(Int,IntRev) :- number_codes(Int,IntL), reverse(IntL,IntLRev), number_codes(IntRev,IntLRev). value(L,V) :- InitialValue = 0, value(L,InitialValue,V). value([],FinalValue,FinalValue). value([X],InitialValue,FinalValue) :- FinalValue is InitialValue + X. value([X,Y|R],InitialValue,FinalValue) :- InitialValue1 is InitialValue + X - Y, value(R,InitialValue1,FinalValue).