关于Prolog统一的愚蠢的细节询问

时间:2012-12-11 16:41:15

标签: list prolog unification cons

在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是未实例化的,但仍然是一个可以与任何东西统一的变量......怎么样? (我有时会专注于奇怪的细节:))

3 个答案:

答案 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绑定到未实例化的变量

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