在 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 未实例化但仍然是一个准备好与任何东西统一的变量不感兴趣.. 怎么会?(有时我喜欢关注奇怪的细节:)
在 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 未实例化但仍然是一个准备好与任何东西统一的变量不感兴趣.. 怎么会?(有时我喜欢关注奇怪的细节:)
在第一种情况下:
?-P=[A|B], P=[1,_].
您说的P
是一个包含两个元素的列表,第一个元素是数字 1(统一到变量 A)。因此,B
必须是一个包含一个元素的列表(一个未命名的变量)。
另一方面,在第二种情况下:
?-P=[A|B], P=[1|_].
您说的P
是一个至少包含一个元素的列表(1 再次统一到A
),但您没有说明其他任何内容。B
可以是空列表,也可以是包含任意数量元素的列表。
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 中,顶层允许您获取最后一个输入(通常:光标向上),以便您可以快速重新编辑右侧。
如果您查看每个查询的第二部分,则第一部分相当于
P=.(1,.(_,[]))
而第二个相当于
P=.(1,_)
首先,B 绑定到 .(_,[]); 即包含未实例化变量的列表
在第二种情况下,B 绑定到一个未实例化的变量
当一个变量只是绑定到一个未实例化的变量时,显示它是没有意义的;在第一个示例中,它绑定到具有一些额外结构的东西,所以展示它是有道理的。