[Prolog]中的[]和[_]是什么意思

时间:2019-06-01 19:51:52

标签: prolog

我相信[]表示接受空列表,而[_]表示可能包含任何内容的非空列表。但是然后在某些情况下,例如说一个函数:

f([]).
f[_]).
f([x|y]):-dostuff.

[x | y]和[_]都不会被调用,因为它们本质上是同一件事吗?

1 个答案:

答案 0 :(得分:1)

在Prolog中,列表表示为链接列表。链表具有两个“模式”:

  1. 空白列表[];和
  2. 带有[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时才满意,这意味着它实际上不是一个列表。