代码之家  ›  专栏  ›  技术社区  ›  Chris

prolog:递归函数重定义

  •  1
  • Chris  · 技术社区  · 15 年前

    有没有一种方法可以“递归地重新定义”(不知道技术术语)prolog谓词?

    考虑这些谓词:

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

    ---GT;

    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 回复  |  直到 15 年前
        1
  •  3
  •   starblue    15 年前

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

    尽管要小心,这是一个强大的功能,您可以很容易地使一个大混乱。

        2
  •  0
  •   Volodymyr Gubarkov    15 年前

    我不太明白你的问题,但也许这会有帮助:

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

    测试:

    ?- t.
    3
    true.
    
    推荐文章