Erlog向erlang返回奇怪的值

Erlog向erlang返回奇怪的值,erlang,prolog,erlog,Erlang,Prolog,Erlog,我正在尝试使用erlog进行一些测试(请参阅此repo:),我得到了一些奇怪的东西 我基本上是在prolog数据库中设置和清除值,当我试图从erlang命令行获取未设置的model(\“key\”,value)值时,发生了一些奇怪的事情。在prolog中,我从erlang命令行得到一个失败,我认为这是正确的,但是由于某种原因,当我在测试中使用property执行此操作时,我会返回[{'Value',{0}],我不确定0是在哪里生成的。是的,erlog的定义是这样的,如果您试图获取一个不存在的子句

我正在尝试使用erlog进行一些测试(请参阅此repo:),我得到了一些奇怪的东西


我基本上是在prolog数据库中设置和清除值,当我试图从erlang命令行获取未设置的
model(\“key\”,value)值时,发生了一些奇怪的事情。
在prolog中,我从erlang命令行得到一个失败,我认为这是正确的,但是由于某种原因,当我在测试中使用property执行此操作时,我会返回
[{'Value',{0}]
,我不确定0是在哪里生成的。

是的,erlog的定义是这样的,如果您试图获取一个不存在的子句,它会失败,即使谓词根本没有定义。因此,如果在\u db(foo,Bar)中执行
not\u操作。
如果在\u db/2谓词中没有定义匹配子句或
not\u,则该操作将始终失败。Erlog没有区分动态声明谓词和静态声明谓词,尽管它可能应该这样做

从测试内部调用它的第二种情况是erlog如何在内部表示变量。如果使用
erlog:prove
调用成功,则返回
{succeed,VarBindings}
,其中
VarBindings
是目标中每个变量的
{VarName,Binding}
列表。因此,对于目标
模型(“foo”,Value)
而言,即使未绑定或仅绑定到另一个未绑定变量,也始终会返回
Value
的值

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

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

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

这可能需要更多的例子

罗伯特