有没有办法“递归重新定义”(不知道技术术语)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)的返回值感兴趣,因此可能有更简单的方法来执行此操作... 无论如何,谢谢你的帮助!
答案 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.