Что касается сопоставления с образцом против арифметики: как бы вы сделали это здесь? Я имею в виду, что задействованные списки недоступны, потому что они являются скрытыми параметрами в правилах DCG ...

те определим пользовательские операторы - пусть это будет++,equals

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

И факт:

check(A equals A).

Я пытаюсь сделать предикат, пусть будетcheck/1, который вернет true во всех следующих ситуациях:

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

вернуть

yes

Как реализовать это в Прологе? (Фрагмент кода, пожалуйста. Возможно ли это? Я что-то упустил?)

Гну-Пролог предпочтителен, но SWI-Пролог также приемлем.

Постскриптум Пожалуйста, рассматривайте код как черновик "псевдокод", и не обращайте внимания на небольшие проблемы с синтаксисом.

P.P.S '++' только начинается. Я хотел бы добавить больше операторов. Вот почему я боюсь, что включение материала в список может быть не хорошим решением.

Дополнительно

Кроме того, было бы неплохо, если бы запросы были возможны (но эта частьне требуется, если ты умеешь отвечать на первую часть, это здорово и достаточно)

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

один из возможных результатов (спасибо @mat за показ других)

X=c, Y=a

В основном я ищу решение для первой части вопроса - проверка «да / нет».

Вторая часть с X, Y была бы хорошим дополнением. В нем X, Y должны быть простыми атомами. Для приведенных выше примеров доменов для X, Y указаны:domain(X,[a,b,c]),domain(Y,[a,b,c]).

Ответы на вопрос(2)

Ваш ответ на вопрос