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 dissAdicionalmente, 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])
.