Prolog:递归函数重定义

时间:2009-12-20 18:11:39

标签: prolog operation

有没有办法“递归重新定义”(不知道技术术语)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定义)来创建新的谓词。

这可能吗?我尝试了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).

由于我只对所有参数设置为1的f(A)的返回值感兴趣,因此可能有更简单的方法来执行此操作... 无论如何,谢谢你的帮助!

2 个答案:

答案 0 :(得分:3)

看看term_expansion/2,它可以在编译器读取时任意修改程序。

虽然要小心,但这是一个强大的功能,你可以很容易地制造一个混乱的混乱。

答案 1 :(得分:0)

我还没有得到你的问题,但也许这可能会有所帮助:

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

试验:

?- t.
3
true.