Prolog: como fazer "check (a ++ b ++ c ++ d é igual a d ++ a ++ c ++ b) -> yes"

Vamos definir operadores personalizados - seja ele++,equals

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

E fato:

check(A equals A).

Eu tento fazer predicado, que sejacheck/1, que retornará verdadeiro em todas as seguintes situações:

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

Retorn

yes

Como implementar isso no Prolog? (Fragmento de código, por favor. É possível? Estou faltando alguma coisa?)

O Gnu-Prolog é o preferido, mas o SWI-Prolog também é aceitáve

P.S. Trate o código como rascunho "pseudocódigo" e não se preocupe com pequenos problemas de sintaxe.

P.P.S '++' está apenas começando. Eu gostaria de adicionar mais operadores. Por isso, receio que colocar as coisas na lista não seja uma boa soluçã

Além diss

Adicionalmente, seria bom se as consultas fossem possíveis (mas, esta partenão é necessári, se você puder responder à primeira parte, é ótimo e suficiente)

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

um dos resultados possíveis (obrigado @mat por mostrar aos outros)

X=c, Y=a

Estou procurando principalmente a solução para a primeira parte da pergunta - verificação "sim / não"

Segunda parte com X, Y seria uma boa adição. Nele X, Y devem ser átomos simples. Para os exemplos de domínios acima para X, Y são especificados:domain(X,[a,b,c]),domain(Y,[a,b,c]).

questionAnswers(2)

yourAnswerToTheQuestion