在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是未实例化的,但仍然是一个可以与任何东西统一的变量......怎么样? (我有时会专注于奇怪的细节:))
答案 0 :(得分:2)
在第一种情况下:
?-P=[A|B], P=[1,_].
你说明P
是一个包含两个元素的列表,第一个是数字1(统一到变量A)。因此,B
必须是包含一个元素(未命名变量)的列表。
另一方面,在第二种情况下:
?-P=[A|B], P=[1|_].
您声明P
是一个至少包含一个元素的列表(1再次统一到A
),但您没有说明任何其他内容。 B
可以是空列表,也可以是包含任意元素的列表。
答案 1 :(得分: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.
等
在许多Prolog中,toplevel允许你拍摄最后一个输入(通常是:向上光标),这样你就可以快速重新编辑右侧。
答案 2 :(得分:1)
如果查看每个查询的第二部分,则第一部分为
P =(1,。(_,[]))
而第二个相当于
P =(1,_)
在第一个中,B被绑定。(_,[]);也就是说,包含未实例化变量的列表
在第二个中,B绑定到未实例化的变量
当一个变量刚刚绑定到一个未实例化的变量时,显示它是没有意义的;在第一个例子中,它被绑定到具有一些额外结构的东西,所以有一点显示它。