Что касается сопоставления с образцом против арифметики: как бы вы сделали это здесь? Я имею в виду, что задействованные списки недоступны, потому что они являются скрытыми параметрами в правилах 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])
.