1

在 Prolog 中:

?-P=[A|B], P=[1,_].
P = [1, _G1091],
A = 1,
B = [_G1091]

B 显示为 [_G1091] 表明它是一个未实例化的变量。但是,如果我稍微改变...

?-P=[A|B], P=[1|_].
P = [1,B],
A = 1,

突然之间,它对向我展示 B 未实例化但仍然是一个准备好与任何东西统一的变量不感兴趣.. 怎么会?(有时我喜欢关注奇怪的细节:)

4

3 回答 3

2

在第一种情况下:

?-P=[A|B], P=[1,_].

您说的P是一个包含两个元素的列表,第一个元素是数字 1(统一到变量 A)。因此,B必须是一个包含一个元素的列表(一个未命名的变量)。

另一方面,在第二种情况下:

?-P=[A|B], P=[1|_].

您说的P是一个至少包含一个元素的列表(1 再次统一到A),但您没有说明其他任何内容。B可以是空列表,也可以是包含任意数量元素的列表。

于 2012-12-11T16:46:10.847 回答
2

Prolog 语法的精确细节有时非常微妙。要习惯它,请使用write_canonical/1它以功能表示法向您显示该术语:

?- write_canonical([A|B]).
'.'(_1,_2)
true.

?- write_canonical([1,_]).
'.'(1,'.'(_1,[]))
true.

我可以推荐一个“练习”练习来习惯 Prolog 的列表符号:

拿一些类似的清单[[1,2],3],现在试着用你能想象到的尽可能多的变体写下来。

?- [[1,2],3] == [[1,2],3|[]].
true.

等等

在许多 Prologs 中,顶层允许您获取最后一个输入(通常:光标向上),以便您可以快速重新编辑右侧。

于 2012-12-11T16:53:27.467 回答
1

如果您查看每个查询的第二部分,则第一部分相当于

P=.(1,.(_,[]))

而第二个相当于

P=.(1,_)

首先,B 绑定到 .(_,[]); 即包含未实例化变量的列表

在第二种情况下,B 绑定到一个未实例化的变量

当一个变量只是绑定到一个未实例化的变量时,显示它是没有意义的;在第一个示例中,它绑定到具有一些额外结构的东西,所以展示它是有道理的。

于 2012-12-11T16:49:42.350 回答