Пролог:Переопределение рекурсивной функции
Вопрос
Есть ли способ "рекурсивно переопределить" (не знаю технического термина) предикаты prolog?
Рассмотрим эти предикаты:
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).
Таким образом, предикат должен получать (двоичную) функцию в качестве входных данных и создает новые предикаты, заполняя параметры функции (#, определенные через arity) слева направо значением 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, возможно, есть более простой способ сделать это...В любом случае, спасибо за вашу помощь!
Решение
Взгляните на срок_расширения/2, он может произвольно изменять программу, когда она считывается компилятором.
Хотя будьте осторожны, это мощная функция, и вы легко можете устроить большую запутанную неразбериху.
Другие советы
Я не совсем понял ваш вопрос, но, возможно, это могло бы быть полезно:
t :-
assert(my_add(A,B,C):-C is A+B),
my_add(1,2,R),
writeln(R).
тест:
?- t.
3
true.