Prolog中的列表统一
我是一个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]统一意味
[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
是原子,而不是变量。:)