Ваша ошибка в том, что в предикате change Вы меняете два соседних элемента, вне зависимости от того, сравним второй элемент по модулю или нет.
Правильный код может выглядеть так (здесь переставляются все четные - т.е. нужно будет немного поработать самому

)
Код:
domains
list=integer*
predicates
nondeterm choice(list,integer,integer)
nondeterm add(integer, integer, list, list)
nondeterm sort_bubble(list, list)
nondeterm permutation(list, list)
clauses
add(A,N,[_|T],[A|T]):-N=1,!.
add(A,N,[H|T],[H|L]):-N1=N-1,add(A,N1,T,L).
choice([H|_],H,1):- (H mod 2)=0,!.
choice([H|T],H1,N):- (H mod 2)<>0,choice(T,H1,N1),N=N1+1.
permutation([H|T],[H1|T1]):-(H mod 2)=0, choice(T,H1,N), H>H1, add(H,N,T,T1),!.
permutation([X|T],[X|T1]):-permutation(T,T1).
sort_bubble(L,L1):- permutation(L,LL),!,sort_bubble(LL,L1).
sort_bubble(L,L).
goal
sort_bubble([3,5,4,2,8,7,6,5,1,2,3,20,10],L).