4

我正在尝试在 ECLiPSe Prolog 中实现一个元程序,这是我编写的代码 -

:- dynamic go/1.
sol(true):- !.
sol((A,B)):- !, sol(A), sol(B).
sol(A):- clause(A, Body), sol(Body).
go(X):- X is 5. 

现在,当我使用 查询时sol(go(X)).,我得到了错误accessing a procedure defined in another module in clause(X is 5, _292)并且它中止了。我尝试清除所有顶级模块并重新打开 ECLiPSe 然后运行,但仍然是同样的错误。

可能是什么原因?

谢谢!

4

1 回答 1

3

Predicatep/1正在使用内置的 predicate (is)/2。请注意,这X is 5是一种语法上更方便的书写方式is(X,5)。但是您的元解释器只期望用户定义的谓词和控制结构(',')/2true/0. 如果你想处理(is)/2你必须为它引入一个单独的子句。

sol(X is Y) :- !, X is Y.

在 ISO Prolog 中,目标predicate_property(Goal,built_in)可用于测试是否Goal是内置谓词。这适用于许多系统,如 B、GNU、SICStus、SWI、XSB、YAP。所以你可以写:

sol(Bip) :- predicate_property(Bip, built_in), !, Bip.

在 ECLiPSe 中,这个内置不是直接可用的。你必须加载一个库。手册的索引建议使用 libraryswiquintus. 由于某些(不清楚)原因,它不是 ECLiPSe 库的一部分iso,但它是 ISO。所以状态

:- use_module(library(swi)).

首先在您的文件中(或在顶层)。

如果您希望元解释器涵盖完整的 Prolog 语言,则必须明确处理所有控制结构。它们在这里 - 如标准中所定义(7.8 控制结构)。

  1. true/0
  2. fail/0
  3. call/1
  4. !/0
  5. (',')/2
  6. (;)/2- 析取
  7. (->)/2
  8. (;)/2- 如果-那么-否则
  9. catch/3
  10. throw/1

Please be aware that only a few of them can be handled by directly calling the goal. Most of them must be handled explicitly!

于 2012-02-19T01:33:07.763 回答