Prolog: cómo hacer "comprobar (a ++ b ++ c ++ d es igual a d ++ a ++ c ++ b) -> sí"

Definamos operadores personalizados: déjelo ser++,equals

:- op(900, yfx, equals).
:- op(800, xfy, ++).

Y hecho:

check(A equals A).

Intento hacer un predicado, déjalo sercheck/1, eso volverá verdadero en todas las siguientes situaciones:

check( a ++ b ++ c ++ d equals c ++ d ++ b ++ a ),
check( a ++ b ++ c ++ d equals d ++ a ++ c ++ b),
check( a ++ b ++ c ++ d equals d ++ b ++ c ++ a ),
% and all permutations... of any amount of atoms
check( a ++ ( b ++ c ) equals (c ++ a) ++ b),
% be resistant to any type of parentheses

regres

yes

¿Cómo implementar esto en Prolog? (Fragmento de código, por favor. ¿Es posible? ¿Me estoy perdiendo algo?)

Gnu-Prolog es preferido, pero SWI-Prolog también es aceptable.

PD. Trate el código como borrador de "pseudocódigo" y no se preocupe por pequeños problemas de sintaxis.

P.P.S '++' apenas está comenzando. Me gustaría agregar más operadores. Es por eso que me temo que poner cosas en la lista podría no ser una buena solución.

Adicionalment

Adicionalmente, sería bueno, si las consultas fueran posibles (pero, esta parteno es requerid, si puede responder a la primera parte, es genial y suficiente)

check( a ++ (b ++ X) equals (c ++ Y) ++ b) )

uno de los posibles resultados (gracias @mat por mostrar otros)

X=c, Y=a

stoy buscando principalmente una solución para la primera parte de la pregunta: comprobación "sí / no".

Segunda parte con X, Y sería una buena adición. En ella, X, Y deben ser átomos simples. Para los dominios de ejemplo anteriores para X, Y se especifican:domain(X,[a,b,c]),domain(Y,[a,b,c]).

Respuestas a la pregunta(2)

Su respuesta a la pregunta