Just write it yourself. You
palindrome([]). % palindrome(ZZ). palindrome([_]). % palindrome([_|Z]-Z). palindrome([A|T]) :- % palindrome([A|T]-Z):- append(Middle,[A],T), % append(Middle-Z2,[A|Z3]-Z3,TZ), palindrome(Middle). % palindrome(Middle-Z2).
Add append(AB,BC,AC) for diff lists, so calling append gives us Z2=[A|Z3], Z3=Z, Middle=T and so (writing out the two halves of the diff-list as two arguments for the predicate) ,
palindrome(Z,Z). palindrome([_|Z],Z). palindrome([A|T],Z) :- palindrome(T, [A|Z]).
Now you can run it
10 ?- palindrome(X,[]). X = [] ; X = [_G340] ; X = [_G340, _G340] ; X = [_G340, _G346, _G340] ; X = [_G340, _G346, _G346, _G340] ; .... 11 ?- X=[a,b,c|_],palindrome(X,[z]). X = [a, b, c, b, a, z] ; X = [a, b, c, c, b, a, z] ; X = [a, b, c, _G460, c, b, a, z] ; X = [a, b, c, _G460, _G460, c, b, a, z] ; .... 16 ?- palindrome([1,2,2,1,0],Z). Z = [1, 2, 2, 1, 0] ; Z = [2, 2, 1, 0] ; Z = [0] ; No
Of course, DCG rules provide a convenient interface for difference lists.