2009-12-20 108 views
1

有没有办法“递归重新定义”(不知道技术术语)序言谓词?序言:递归函数重定义

考虑这些谓词:

f(X,Y,A):-A is Y xor X. 
arity(f,2). 

现在我想自动创建两个新的谓词F1/2和F2/1,定义如下:

f1(Y,A):-f(1,Y,A). 
f2(A):-f1(1,A). 

所以谓语应该得到一个(二进制)函数作为输入,并通过用1从左到右填充函数的参数(#通过arity定义)来创建新谓词。

这可能吗?我尝试过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)的返回值仅interrested与所有参数设置为1有可能是一个更简单的方法来做到这一点... 无论如何,感谢您的帮助!

+0

我对你以后的事情有点困惑。你能举一个更高级的例子吗?另外,您是否希望将新谓词添加到prolog数据库中以供立即使用,还是只想将它们写出到文本文件中? – nedned 2009-12-21 01:11:49

回答

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.