我正在尝试使用erlog进行一些测试(看到这个回复:https://github.com/zkessin/erl_cache/tree/master/test),我得到了一些奇怪的东西。
我基本上设置和清除prolog数据库中的值并且发生了一些奇怪的事情,当我尝试从erlang命令行获取prolog中未设置model(\"key\", Value).
的值时,我收到了失败,这是我认为是正确的,但出于某种原因,当我从一个正确的测试中做到这一点时,我回到[{'Value', {0}}]
并且我不确定0的生成位置。
答案 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表。
这可能需要更多例子。
罗伯特