2009-12-20 7 views
1

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

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

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(), но ничего не удалось.

Кто-нибудь знает, как это сделать? Любая помощь будет действительно оценена.

Edit: пример для более высокой арностью:

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). 

Поскольку я только interrested в возвращаемом значении F (A) со всеми параметрами установленный на 1, может быть более простой способ сделать это ... В любом случае, спасибо за помощь!

+0

Я немного смущен тем, что вам нужно. Можете ли вы привести пример более высокой ясности? Кроме того, вы хотите, чтобы новые предикаты были добавлены в базу данных пролога для немедленного использования, или вы хотите просто записать их в текстовый файл? – nedned

ответ

3

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

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

0

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

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

тест:

?- t. 
3 
true. 
Смежные вопросы