Есть ли способ "рекурсивно переопределить" (не знаю, технический термин) предикаты пролога?
Рассмотрим эти предикаты:
f(X,Y,A):-A is Y xor X.
arity(f,2).
теперь я хочу автоматически создать 2 новых предиката f1 / 2 и f2 / 1 со следующим определением:
f1(Y,A):-f(1,Y,A).
f2(A):-f1(1,A).
Таким образом, предикат должен получить (двоичную) функцию в качестве входных данных и создать новые предикаты, заполнив параметры функции (# определяемые через арность) слева направо 1.
Возможно ли это? Я пробовал различные комбинации оператора univ и call (), но ничего не получилось.
Кто-нибудь знает, как это сделать? Любая помощь будет принята с благодарностью.
Редактировать: пример для более высокой арности:
f(W,X,Y,Z,A):-A is Y xor X xor W xor Z.
arity(f,4).
->
f1(X,Y,Z,A):-f(1,X,Y,Z,A).
f2(Y,Z,A):-f1(1,Y,Z,A).
f3(Z,A):-f2(1,Z,A).
f4(A):-f3(1,A).
Поскольку меня интересует только возвращаемое значение f (A) со всеми параметрами, установленными в 1, возможно, существует более простой способ сделать это ...
В любом случае, спасибо за вашу помощь!