Просто мысль: если вы трактуете A
как предикат Пролога (я бы предположил, что вы будете, если вы спросите, как это можно сделать в Прологе), безусловно, можно выразить следующее:
'A'(C, Y, V) :- 'A'(Y, C, V).
Кстати, это фактический синтаксис Пролога.Он определяет предикат 'A'/3
, который меняет порядок первых двух аргументов.На практике, однако, такой предикат не продвинет вашу программу Prolog слишком далеко, так как он заставит интерпретацию 'A'/3
в бесконечный цикл.
Однако, если вы просто хотите, чтобы ваша база данных содержала 'A'/3
термины, которые отражают намерение, что каждый вставленный факт, совпадающий с 'A'(Y, C, V)
, также связан с другим фактом, совпадающим с 'A'(C, Y, V)
(по любой причине), тогда это действительно возможно следующим образом:
'A'(c, y, v).
'A'(C, Y, V) :- 'A'(Y, C, V).
Выполнениеэто дает:
?- 'A'(X,Y,Z).
X = c,
Y = y,
Z = v ;
X = y,
Y = c,
Z = v
... обратите внимание, что это будет продолжаться при возврате, чтобы дать вам альтернативные привязки, до бесконечности , что не очень полезно.Тем не менее, если вашей программе просто необходимо проверить наличие определенных фактов 'A'/3
с помощью этой программы, вы все равно можете использовать либо once('A'(X,Y,Z))
(если ваш Prolog имеет встроенный once/1
), либо составной подцель 'A'(X,Y,Z), !
этого было бы достаточно, если один или несколько фактов для 'A'/3
установлены перед рекурсивным определением.
Хотя я бы не рекомендовал делать это в реальной программе Prolog; -)