我相信 [] 意味着接受空列表,而 [_] 接受可能包含任何内容的非空列表。但在某些上下文中,例如说一个函数:
f([]).
f[_]).
f([x|y]):-dostuff.
[x|y] 和 [_] 不会同时被调用吗,因为它们本质上意味着相同的事情?
最佳答案
在 Prolog 中,列表表示为链接列表。链表有两种“模式”:
- 空列表
[]
;和 - “cons”
[H|T]
与H
和T
参数与H
head 列表(第一个元素),T
列表尾部(包含剩余元素的列表)。
因此,我们可以呈现一个没有元素的列表,如 []
,有一个元素,如 [H1|[]]
,有两个元素,如 [H1 |[H2|[]]]
,等等。
上面的符号有点冗长,可以使用列表语法糖。例如[H1, H2]
相当于[H1|[H2|[]]]
,同样的方式[H1,H2|T]
code> 相当于 [H1|[H2|T]]
。
因此,代码中的 [_]
是 [_|[]]
的语法糖。这意味着这是一个单例列表(一个恰好有一个元素_
的列表),我们在这里不关心该值列表,只要它与该模式统一即可。
But then in some context such as say a function.
f/1
这里不是一个函数,它是一个谓词。这里意味着谓词 f/1
满足空列表、包含一个元素的列表(无论该元素是什么)以及列表 [X|Y]
(我假设这些是大写标识符,否则只有当头部是常量 x
且尾部是常量 y
时才满足,这意味着它是并不是真正的列表)。
关于prolog - Prolog中的[]和[_]是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56409962/