Пролог: переопределение рекурсивной функции - PullRequest
1 голос
/ 20 декабря 2009

Есть ли способ "рекурсивно переопределить" (не знаю, технический термин) предикаты пролога?

Рассмотрим эти предикаты:

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, возможно, существует более простой способ сделать это ... В любом случае, спасибо за вашу помощь!

Ответы [ 2 ]

3 голосов
/ 21 декабря 2009

Взгляните на term_expansion / 2 , он может произвольно изменять программу, когда она читается компилятором.

Хотя будьте осторожны, это мощная функция, и вы легко можете сделать большой беспорядок.

0 голосов
/ 21 декабря 2009

Я не совсем понял ваш вопрос, но, возможно, это может быть полезно:

t :-
    assert(my_add(A,B,C):-C is A+B),
    my_add(1,2,R),
    writeln(R).

тест:

?- t.
3
true.
...