我一直在阅读本教程的Prolog的列表,以及如何从列表中得到具体的元素,我碰到这个例子就是:正从列表中特定元素的Prolog
?- [_,X,_,Y|_] = [[], dead(z), [2, [b, c]], [], Z].
X = dead(z)
Y = []
Z = _9593
什么我不明白的是,他们在哪里得到变量Z的值_9593?
我一直在阅读本教程的Prolog的列表,以及如何从列表中得到具体的元素,我碰到这个例子就是:正从列表中特定元素的Prolog
?- [_,X,_,Y|_] = [[], dead(z), [2, [b, c]], [], Z].
X = dead(z)
Y = []
Z = _9593
什么我不明白的是,他们在哪里得到变量Z的值_9593?
下划线意味着我们不关心变量和int你的榜样
[_,X,_,Y|_] = [[], dead(z), [2, [b, c]], [], Z].
我们第一个下划线分配给[]
,然后X
被分配到分配给[2. [b.c]]
dead(z)
然后第二个下划线,然后Y
分配给[]
然后尾部是下划线,这是我们不在乎什么,但因为你有Z
变量在右侧,它分配_
到Z
和Prolog的方式做这是引入任意变量开始_something
,在你的情况下它的_9593
。毕竟你不应该担心,因为你不在乎什么是下划线。
我对@Timplar的解释感到担忧,尽管技术细节是正确的,但我担心让术语变得正确。
这里没有分配。只有统一。我们要求Prolog在这里做的是统一[_, X, _, Y|_]
与[[], dead(z), [2, [b, c]], [], Z]
。这是没有结果哪一方有值或变量。而不是想象Prolog走在左边,然后走到右边,当它不能继续时,想象列表被压缩在一起可能会更安全。
首先,Prolog试图使用[]来统一_。这个微不足道的成功,因为_意味着“我不在乎”。这种统一没有建立任何约束力。
接下来,Prolog尝试使用dead(z)
来统一X.这个微不足道的成功,因为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相同的信息给出了,但词汇略有不同,这里为您的娱乐。
Z = _9593
这只是一个自动生成的唯一变量名。规则和事实中的变量必须(一致地)重命名,以确保唯一性。如果我们在两个不相关的查询中使用Z
,那么这两个变量是不相关的,因此必须有不同的名称。
你可以看到一个简单的目标同样的效果,
1 ?- Z=Z.
Z = _G213
Yes
2 ?- write(Z).
_G236
Z = _G236
213
,9593
只是一个由特定的Prolog实现方式维护一些内部计数器的反射。领先的下划线通常表示它是一些一次性变量。
对不起,我的意思是真正的统一而不是分配 – Templar 2013-03-21 21:05:26