Решение на а) (малко дългичко ми излезе, но предикатите get_first и diff_count са по-универсални от необходимостта на конкретната задача):
%:: BEGIN CODE::
%допълнителни предикати
append([], B, B).
append([H|T], B, [H|C]):-append(T, B, C).
reverse([], []):-!.
reverse([H|T], R):-reverse(T, T1), append(T1, [H], R).
%ясно какво прави :)
length([], 0):-!.
length([_|T], L):-length(T, L1), L is L1 + 1.
%връща във втория си аргумент първите C елемента на първия списък
get_first([], [], _):-!.
get_first(_, [], 0):-!.
get_first([H|T], [H|R], C):-C>0, C1 is C - 1, get_first(T, R, C1).
%брои в колко позиции се различават два списъка
%ако те са с различна дължина, всички позиции в повече
%се броят за различни
diff_count([], L, C):-!, length(L, C).
diff_count(L, [], C):-!, length(L, C).
diff_count([H|T1], [H|T2], C):-!, diff_count(T1, T2, C).
diff_count([_|T1], [_|T2], C):-diff_count(T1, T2, C1), C is C1 + 1.
a_pal_mod([]):-!.
a_pal_mod(L):-reverse(L, L), !, length(L, Len), Len mod 2 =:= 1.
a_pal_mod(L):-length(L, Len), Half is Len // 2,
reverse(L, L1), get_first(L, N, Half), get_first(L1, M, Half),
diff_count(N, M, 1).
%::END CODE::
В листовете, които имам в б) се иска при ДОБАВЯНЕ на произволен елемент на произволно място да се получи палиндром...
Иначе само с изтриване става доста лесно - само един генератор на списък, в който липсва един от елементите му...
%::BEGIN CODE::
%генерира списъка с добавен Х на произволно място
insert_gen(X, [], [X]):-!.
insert_gen(X, [H|T], [X|[H|T]]).
insert_gen(X, [H|T], [H|R]):-insert_gen(X, T, R).
%генерира елементите на списъка последователно
at_gen([H|_], H).
at_gen([_|T], X):-at_gen(T, X).
a_pal_ins(L):-reverse(L, L), !.
a_pal_ins(L):-at_gen(L, X), insert_gen(X, L, R), reverse(R, R).
%::END CODE::
Някакви забележки?