我相信[]表示接受空列表,而[_]表示可能包含任何内容的非空列表。但是然后在某些情况下,例如说一个函数:
f([]).
f[_]).
f([x|y]):-dostuff.
[x | y]和[_]都不会被调用,因为它们本质上是同一件事吗?
答案 0 :(得分:1)
在Prolog中,列表表示为链接列表。链表具有两个“模式”:
[]
;和[H|T]
的“ cons” H
和带有列表{ head (第一个元素)的T
的{{1}}参数,以及H
列表的尾部(具有剩余元素的列表)。因此我们可以显示一个列表,其中没有元素为T
,一个元素为[]
,两个元素为[H1|[]]
,依此类推。
以上表示有点冗长,可以将 synactical 糖用于列表。例如,[H1|[H2|[]]]
等效于[H1, H2]
,[H1|[H2|[]]]
等效于[H1,H2|T]
。
因此,您代码中的[H1|[H2|T]]
是[_]
的语法糖。这意味着这是一个单个列表(一个具有恰好一个元素[_|[]]
的列表),在这里我们不在乎列表的那个值,因为只要它与该模式统一。
但是在某些情况下,例如说一个函数。
_
这里不是一个函数,它是一个谓词。它在这里意味着谓词f/1
对于一个空列表,一个具有一个元素的列表(无论该元素是什么)以及一个列表f/1
(满足这些条件都是大写标识符)都得到了满足。仅当头部为常数[X|Y]
,而尾部为常数x
时才满意,这意味着它实际上不是一个列表。