Erlog​​向erlang返回奇怪的值

时间:2014-05-07 15:50:57

标签: erlang prolog erlog

我正在尝试使用erlog进行一些测试(看到这个回复:https://github.com/zkessin/erl_cache/tree/master/test),我得到了一些奇怪的东西。

我基本上设置和清除prolog数据库中的值并且发生了一些奇怪的事情,当我尝试从erlang命令行获取prolog中未设置model(\"key\", Value).的值时,我收到了失败,这是我认为是正确的,但出于某种原因,当我从一个正确的测试中做到这一点时,我回到[{'Value', {0}}]并且我不确定0的生成位置。

1 个答案:

答案 0 :(得分:2)

是的,定义了erlog,这样如果你试图获得一个不存在的子句,它就会失败,即使谓词根本没有定义。因此,如果您执行not_in_the_db(foo, Bar).,它将始终失败,如果没有匹配的子句或根本没有定义not_in_the_db/2谓词。 Erlog​​没有区分动态声明的谓词和静态谓词,尽管它可能应该。

从测试中调用它的第二种情况是erlog如何在内部表示变量。如果您使用erlog:prove成功拨打电话,则会返回{succed,VarBindings},其中VarBindings是目标中每个变量的{VarName,Binding}列表。因此,对于目标model("foo", Value),您将始终返回Value的值,即使它尚未绑定或仅绑定到另一个未绑定的变量。

这是内部表示的来源。在erlog中,变量由元组{Name}表示,其中名称是整数,例如{45}{139}。当您构建目标以证明目标中的变量具有相同的结构时,不同之处在于您可以在元组中使用变量Name。它将在解释器中转换为带有数字的内部表示。因此,当您发送字符串model("foo", Value)时,它首先被解析为内部表示{model,"foo",{Name}},然后发送给解释器。显然,这里目标成功,但Value未绑定,因此返回的值是变量,变量的内部表示,在本例中为{0}

这就是为什么我对你的补丁允许字符串作为目标有点怀疑,你丢失了目标中的内部表示但是将其恢复到值中。您总是可以将变量值转换回打印的表示形式,但这样做会毫无用处,因为除了打印它们之外,您无法对它们执行任何操作。

正如我所看到的,erlog的一个明确用例是erlang和erlang使用相同的数据,因此在它们之间传递数据是透明的。因此,例如,很容易使用erlog来处理ETS / Mnesia表,因为不需要进行数据转换。有一个简单的演示模块可以执行此操作,并允许您回溯ETS表。

这可能需要更多例子。

罗伯特