【问题标题】:Prolog: Recursive function redefinitionProlog:递归函数重定义
【发布时间】:2009-12-20 18:11:38
【问题描述】:

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

考虑这些谓词:

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

所以谓词应该得到一个(二进制)函数作为输入,并通过从左到右用 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).

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

【问题讨论】:

  • 我对你所追求的有点困惑。你能举一个更高的例子吗?另外,您是希望将新谓词添加到 prolog 数据库中以立即使用,还是只想将它们写到文本文件中?

标签: prolog operation


【解决方案1】:

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

虽然要小心,但这是一个强大的功能,你很容易弄得一团糟。

【讨论】:

    【解决方案2】:

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

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

    测试:

    ?- t.
    3
    true.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      相关资源
      最近更新 更多