【问题标题】:Silly detail enquiry about Prolog unification关于 Prolog 统一的愚蠢细节查询
【发布时间】:2012-12-11 16:41:15
【问题描述】:

在序言中:

?-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 未实例化但仍然是一个准备好与任何东西统一的变量不感兴趣.. 怎么会? (有时我喜欢关注奇怪的细节:))

【问题讨论】:

  • 谢谢你们三个……你们基本上回答了这个问题,让我明白了你们所有人,所以我想把 grren V 放在你们三个身上!谢谢:)

标签: list prolog unification cons


【解决方案1】:

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 中,顶层允许您获取最后一个输入(通常:光标向上),以便您可以快速重新编辑右侧。

【讨论】:

  • 谢谢!好主意!我正在做:)
【解决方案2】:

第一种情况:

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

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

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

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

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

【讨论】:

  • 啊哈,那么它甚至没有为它准备一个变量吗?它甚至不知道它可能在那里,但它会接受我声称在那里的任何东西并创建匿名变量,因为它可以这么说......如果你知道我的意思......
  • @fast-reflexes:第二种情况仍然有 B 未绑定,因此它将与任何术语统一。第一种情况只会将 B 与一个术语列表统一
【解决方案3】:

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

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

第二个相当于

P=.(1,_)

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    相关资源
    最近更新 更多