从Prolog中的列表中获取特定元素

时间:2013-03-21 02:13:47

标签: list prolog

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

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

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

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

3 个答案:

答案 0 :(得分:2)

我对@Timlar的解释感到焦虑,虽然技术细节是正确的,但我担心这个术语是正确的。

这里没有分配。只有统一。我们要求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相同的信息,但词汇量略有不同,这是为了你的娱乐。

答案 1 :(得分:2)

Z  =  _9593 

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

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

1 ?- Z=Z.

Z = _G213 

Yes
2 ?- write(Z).
_G236

Z = _G236

2139593只是某个内部计数器的反映,该​​计数器由特定的Prolog实现维护。领先的下划线通常表示它是一些一次性变量。

答案 2 :(得分:1)

下划线意味着我们不关心变量和你的例子

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

我们将第一个下划线分配给[],然后将X分配给dead(z),然后将第二个下划线分配给[2. [b.c]],然后将Y分配给[] 1}}然后尾部是下划线,我们不关心什么,但由于你在右侧有Z变量,它将_分配给Z和Prolog的做法从_something开始引入任意变量,在你的情况下是_9593。毕竟你不应该担心,因为你不关心什么是下划线。