在prolog中编译元程序时出错

时间:2012-02-18 15:30:32

标签: prolog logic iso-prolog

我正在尝试在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然后运行,但仍然是同样的错误。

可能是什么原因?

谢谢!

1 个答案:

答案 0 :(得分:3)

谓词p/1正在使用内置谓词(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中,此内置功能无法直接使用。你必须加载一个库。 index of the manual建议使用库swiquintus。对于某些(不清楚)原因,它不是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 - disjunction
  7. (->)/2
  8. (;)/2 - if-then-else
  9. catch/3
  10. throw/1
  11. 请注意,只有少数人可以通过直接调用目标来处理。其中大多数必须明确处理!