【问题标题】:No permission to access private_procedure `var/1'无权访问 private_procedure `var/1'
【发布时间】:2019-09-08 13:27:31
【问题描述】:

我使用元编程技术在 Prolog 中编写了一个简单的统一算法(带有发生检查)。我正在使用 SWI-Prolog 7.4.2。

我想在元解释器中使用它,例如经典的 vanilla 元解释器:

solve(true) :- !.
solve((A,B)) :- solve(A), solve(B).
solve(A) :- clause(A,B), solve(B).

如果我尝试例如solve(odd(X)),它会起作用,作为第一个解决方案X = s(0)。 (其中子句为odd(s(0)).odd(s(s(X))) :- odd(X).

但如果我尝试使用solve 执行统一算法,它就不再起作用了。由于我在统一算法中使用了像 var/1 这样的元谓词,因此我尝试了更简单的目标。

问题是这样的:如果我输入solve(var(X)),它会显示No permission to access private_procedure 'var/1'。 我找不到有关此的有用信息,有人可以帮忙吗?谢谢。

【问题讨论】:

    标签: prolog metaprogramming logic-programming


    【解决方案1】:

    试试:

    solve(true) :- !.
    solve((A,B)) :- solve(A), solve(B).
    solve(A) :- predicate_property(A,built_in), !, call(A).
    solve(A) :- clause(A,B), solve(B).
    

    但这在所有 Prolog 系统中的工作方式并不相同......但隐含的提示应该可以帮助您继续前进。

    【讨论】:

      猜你喜欢
      • 2010-10-28
      • 2018-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多