prolog - 在 prolog 中编译数据程序时出错

标签 prolog logic iso-prolog prolog-metainterpreter

我正在尝试在 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)). 查询时,出现错误访问子句中另一个模块中定义的过程(X is 5, _292) 然后它就中止了。我尝试清除所有顶级模块并重新打开 ECLiPSe 然后运行,但仍然出现相同的错误。

可能是什么原因?

谢谢!

最佳答案

谓词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. 失败/0
  3. 调用/1
  4. !/0
  5. (',')/2
  6. (;)/2 - 析取
  7. (->)/2
  8. (;)/2 - if-then-else
  9. catch/3
  10. 抛出/1

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

关于prolog - 在 prolog 中编译数据程序时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9342460/

相关文章:

Prolog 用户输入的时间限制(读取)

prolog - 在 gprolog 中声明一个动态谓词

php - 编程逻辑 - 在特定时间间隔后仅更新数据库一次

floating-point - “float”对Prolog的实现意味着什么?

prolog - 序言中的国际象棋游戏

machine-learning - prolog作为智能语言是如何工作的?

logic - 将业务规则与业务逻辑分离

C# 通过一个属性比较两个列表并更改第一个列表的值

prolog - Prolog 中更安全的类型测试

operators - 具有相同优先级的 Prolog 中缀运算符一个 xfy 和另一个 yfx 具有两个顺序运算符