Prolog中的列表统一

Prolog中的列表统一,prolog,Prolog,我是一个Prolog新手,有一个关于列表统一的非常简单的问题 如果[a,b,c]与[a | T]相结合,则导致T=[b,c] 为什么[a,b,c]不能与[b | t]统一 统一意味着以一种非常简单的方式匹配模式。统一时: [a, b, c] = [a | T] 您的意思是,在右侧,第一个列表包含一个元素a,后跟一个尾部T。现在,如果你说: [a, b, c] = [b | T] 前面的语句不适用,因为您在左侧没有一个以a开头,后面是尾部列表T,即[a,b,c]没有与列表[b | T]统一意味

我是一个Prolog新手,有一个关于列表统一的非常简单的问题

如果
[a,b,c]
[a | T]
相结合,则导致
T=[b,c]


为什么
[a,b,c]
不能与
[b | t]
统一

统一意味着以一种非常简单的方式匹配模式。统一时:

[a, b, c] = [a | T]
您的意思是,在右侧,第一个列表包含一个元素
a
,后跟一个尾部
T
。现在,如果你说:

[a, b, c] = [b | T]

前面的语句不适用,因为您在左侧没有一个以
a
开头,后面是尾部列表
T
,即
[a,b,c]
没有与列表
[b | T]
统一意味着以非常简单的方式匹配模式。统一时:

[a, b, c] = [a | T]
您的意思是,在右侧,第一个列表包含一个元素
a
,后跟一个尾部
T
。现在,如果你说:

[a, b, c] = [b | T]

前面的陈述不适用,因为您在左侧没有一个以
a
开头并紧跟其后的尾部列表
T
,即
[a,b,c]
与列表
[b | T]

不统一,因为
b
不是列表的头部
[a,b,c]
。Prolog列表表示法是一种非常简单的结构上的语法糖

  • 空列表表示为atom
    []

  • 非空列表(即长度为1或更多的列表)表示为单个
    /2
    结构(
    (a,B)
    ),其中结构的第一个(最左侧)参数是列表的头部(第一项),第二个(最右侧)参数是尾部(作为列表的剩余部分的列表,可以是空列表,也可以是递归的另一个非空列表。因此

    • 一个项目的列表,
      [A]
      ,在内部表示为以下序言术语:

      .(a,[]).
      
    • 两个项目的列表,
      [A,b]
      在内部表示,如您所料:

      .(a,.(b,[]))
      
    • 三个项目的列表,
      [A、b、c]
      以相同的方式表示:

      .(a,.(b,.(c,[])))
      
    等等

prolog列表表示法中的竖条(
|
)运算符用于将列表划分为其头部和尾部,同样也是相同的
/2
结构的语法糖

[H|T]
完全相同于

.(H,T)
.(A,.(B,Rest))
.(A,.(B,.(C,Rest)))
还有一种表达方式,比如

[A,B|Rest]
[A,B,C|Rest]
分别与

.(H,T)
.(A,.(B,Rest))
.(A,.(B,.(C,Rest)))
考虑到所有这些,我们应该很清楚为什么

[a,b,c] = [b|T]
失败,因为它与以下内容完全相同:

.(a,.(b,.(c,[]))) = .(b,T)

每一方的第一个元素,分别是
a
b
,是不同的,因此统一失败了。

因为
b
不是列表的头
[a,b,c]
。Prolog列表符号是一个非常简单的结构上的语法糖

  • 空列表表示为atom
    []

  • 非空列表(即长度为1或更多的列表)表示为单个
    /2
    结构(
    (a,B)
    ),其中结构的第一个(最左侧)参数是列表的头部(第一项),第二个(最右侧)参数是尾部(作为列表的剩余部分的列表,可以是空列表,也可以是递归的另一个非空列表。因此

    • 一个项目的列表,
      [A]
      ,在内部表示为以下序言术语:

      .(a,[]).
      
    • 两个项目的列表,
      [A,b]
      在内部表示,如您所料:

      .(a,.(b,[]))
      
    • 三个项目的列表,
      [A、b、c]
      以相同的方式表示:

      .(a,.(b,.(c,[])))
      
    等等

prolog列表表示法中的竖条(
|
)运算符用于将列表划分为其头部和尾部,同样也是相同的
/2
结构的语法糖

[H|T]
完全相同于

.(H,T)
.(A,.(B,Rest))
.(A,.(B,.(C,Rest)))
还有一种表达方式,比如

[A,B|Rest]
[A,B,C|Rest]
分别与

.(H,T)
.(A,.(B,Rest))
.(A,.(B,.(C,Rest)))
考虑到所有这些,我们应该很清楚为什么

[a,b,c] = [b|T]
失败,因为它与以下内容完全相同:

.(a,.(b,.(c,[]))) = .(b,T)

每一方的第一个元素分别是
a
b
,它们是不同的,因此统一失败。

a
b
是原子,而不是变量。
a
b
是原子,而不是变量。:)