List 关于Prolog统一的愚蠢细节查询

List 关于Prolog统一的愚蠢细节查询,list,prolog,unification,cons,List,Prolog,Unification,Cons,在序言中: ?-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是一个包含两个元素的列表,第一

在序言中:

?-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可以是空列表,也可以是包含任意数量元素的列表

在第一种情况下:

?-P=[A|B], P=[1,_].
您所说的
p
是一个包含两个元素的列表,第一个元素是数字1(统一为变量a)。因此,
B
必须是一个包含一个元素(未命名变量)的列表

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

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

您正在声明
p
是一个至少包含一个元素的列表(1再次统一为
a
),但您没有声明任何其他内容<代码>B可以是空列表,也可以是包含任意数量元素的列表

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

p=(1,.(,[]))

而第二个相当于

p=(1,u1)

在第一种情况下,B被绑定到。(,[]);也就是说,包含未实例化变量的列表

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


当一个变量仅仅绑定到一个未实例化的变量时,没有必要显示它;在第一个示例中,它绑定到具有一些附加结构的内容,因此显示它是有意义的。

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

p=(1,.(,[]))

而第二个相当于

p=(1,u1)

在第一种情况下,B被绑定到。(,[]);也就是说,包含未实例化变量的列表

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


当一个变量仅仅绑定到一个未实例化的变量时,没有必要显示它;在第一个示例中,它绑定到具有一些附加结构的内容,因此显示它是有意义的。

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

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

?- write_canonical([1,_]).
'.'(1,'.'(_1,[]))
true.
我可以推荐一个“训练”练习来习惯Prolog的列表符号吗

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

?- write_canonical([1,_]).
'.'(1,'.'(_1,[]))
true.
拿一些类似于
[[1,2],3]
的列表,现在试着用你能想象到的多种变体把它写下来

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


在许多序言中,toplevel允许您进行最后一次输入(通常是:光标向上),以便您可以快速重新编辑右侧。

序言语法的精确细节有时相当微妙。要习惯它,请使用
write_canonical/1
,它以函数表示法显示术语:

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

?- write_canonical([1,_]).
'.'(1,'.'(_1,[]))
true.
我可以推荐一个“训练”练习来习惯Prolog的列表符号吗

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

?- write_canonical([1,_]).
'.'(1,'.'(_1,[]))
true.
拿一些类似于
[[1,2],3]
的列表,现在试着用你能想象到的多种变体把它写下来

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


在许多序言中,toplevel允许您进行最后一次输入(通常是:光标向上),这样您就可以快速地重新编辑右侧。

Aha那么它甚至不准备变量了吗?它甚至不知道它可能在那里,但它会接受我声称存在的任何东西,并创建匿名变量,可以这么说。。。如果你知道我的意思…@快速反应:第二种情况仍然有B未绑定,因此它将与任何术语统一。第一种情况只会用一个termAha的列表来统一B,所以它甚至没有为它准备一个变量?它甚至不知道它可能在那里,但它会接受我声称存在的任何东西,并创建匿名变量,可以这么说。。。如果你知道我的意思…@快速反应:第二种情况仍然有B未绑定,因此它将与任何术语统一。第一个案例只会将B与一个术语列表统一起来谢谢!好主意我正在做:)谢谢!好主意我在做:)谢谢你们三个。。。你基本上回答了这个问题,让我明白了你们所有人的意思,所以我想把grren V放在你们三个人身上!谢谢:)谢谢你们三位。。。你基本上回答了这个问题,让我明白了你们所有人的意思,所以我想把grren V放在你们三个人身上!谢谢:)