Пролог:Переопределение рекурсивной функции

StackOverflow https://stackoverflow.com/questions/1936506

  •  20-09-2019
  •  | 
  •  

Вопрос

Есть ли способ "рекурсивно переопределить" (не знаю технического термина) предикаты 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.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top