1

我一直在阅读有关 Prolog 列表以及如何从列表中获取特定元素的教程,并且遇到了这个示例:

 ?-  [_,X,_,Y|_]  =  [[],  dead(z),  [2,  [b,  c]],  [],  Z]. 

   X  =  dead(z) 
   Y  =  [] 
   Z  =  _9593 

我不明白的是,他们从哪里获得变量 Z 的值 _9593?

4

3 回答 3

2

我很担心@Templar 的解释,虽然技术细节是正确的,但我担心术语是否正确。

这里没有分配。只有统一。我们在这里要求 Prolog 做的是[_, X, _, Y|_][[], dead(z), [2, [b, c]], [], Z]. 一侧有值或变量无关紧要。与其想象 Prolog 在无法继续时从左侧走,然后从右侧走,不如想象将列表压缩在一起可能更安全。

首先,Prolog 尝试将 _ 与 [] 统一起来。这很容易成功,因为 _ 表示“我不在乎”。这个统一没有建立任何绑定。

接下来,Prolog 尝试将 X 与dead(z). 这很容易成功,因为 X 是未绑定的,这建立了一个绑定,X = dead(z). 因为这个变量不以下划线开头,Prolog 认为你会对这个绑定感兴趣,所以它会报告给你。

接下来,Prolog 尝试将 _ 与[2, [b, c]]. 同样,这在没有建立绑定的情况下很容易成功。

接下来,Prolog 尝试将 Y 与 [] 统一,再次成功,但这次建立了它报告给您的绑定 Y = []。

在下一步之前,您必须进行符号更改。在 Prolog 中,[X|T]是以 X 开头并以 T 继续的列表。因此,[X|_]将 X 与列表的第一个元素统一并丢弃尾部。所以在这种情况下,|_]本质上说,这个列表可能还有更多,但我并不在乎特别想知道它是什么。(顺便说一句,空列表会匹配。)

接下来,Prolog 尝试将匿名尾部|_与 Z 统一起来。这又一次成功了,因为 Z 没有被绑定。Prolog 创建了一个匿名变量并将其绑定到 Z,因此这建立了一个绑定。

因此,与@Templar 提供的信息相同,但词汇略有不同,供您娱乐。

于 2013-03-21T03:55:42.237 回答
2
Z  =  _9593 

这只是一个自动生成的唯一变量名。规则和事实中的变量必须(一致地)重命名,以确保唯一性。如果我们Z在两个不相关的查询中使用,这两个变量是不相关的,所以必须有不同的名称。

您可以通过更简单的目标看到相同的效果,

1 ?- Z=Z.

Z = _G213 

Yes
2 ?- write(Z).
_G236

Z = _G236

213,9593只是特定 Prolog 实现维护的一些内部计数器的反映。前导下划线通常表示它是一些一次性变量。

于 2013-03-22T19:18:17.317 回答
1

下划线表示我们不关心变量和 int 你的例​​子

[_,X,_,Y|_]  =  [[],  dead(z),  [2,  [b,  c]],  [],  Z]. 

我们将第一个下划线分配给[],然后X分配给dead(z)第二个下划线[2. [b.c]],然后Y分配给[],然后尾部是下划线,这是我们不在乎的,但是因为你Z在右手边有变量,它分配_Z和 Prolog 方式这样做是_something在你的情况下引入任意变量,从_9593. 毕竟,您不应该担心这一点,因为您不在乎下划线是什么。

于 2013-03-21T03:14:34.297 回答