在 prolog 中编译元程序时出错

Posted

技术标签:

【中文标题】在 prolog 中编译元程序时出错【英文标题】:error while compling the metaprogram in prolog 【发布时间】:2012-03-09 16:35:54 【问题描述】:

我正在尝试在 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】:

谓词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 Control 构造)。

    true/0 fail/0 call/1 !/0 (',')/2 (;)/2 - 析取 (->)/2 (;)/2 - if-then-else catch/3 throw/1

请注意,只有少数可以通过直接调用目标来处理。其中大部分必须明确处理!

【讨论】:

以上是关于在 prolog 中编译元程序时出错的主要内容,如果未能解决你的问题,请参考以下文章

在 CLion 中编译简单程序时出错

BigtableConnection API 失败;从元数据服务器获取访问令牌时出错

在 petalinux 中编译 gstreamer 应用程序时出错

在树莓派的交叉编译 qt 中构建应用程序时出错

VS2012编译的MFC程序XP运行出错R6010

尝试编译二叉树程序时出错