在我探索记录列表的不同方法的过程中,我对佩雷拉和希伯的“Prolog和自然语言分析”(Prolog and )一书(数字版第42页)中的“Prolog和自然语言分析”(Prolog and )一书中的列表数字版感兴趣。
起初,我认为这样的表示法在语法上是不正确的,因为它必须说是[[a,b]|[c]],但是在使用write_canonical/1之后,Prolog返回了'.'('.'(a,'.'(b,[])),c)。
据我所见,这对应于以下树结构(虽然在我看来,这种结构只是以c结尾,而没有末尾的空列表):

不过,我似乎找不到使用逗号和括号的对应符号。我认为它应该与[[a,b],c]相对应(但这显然会返回与write_canonical/1不同的结果)。
是否没有对应的[[a,b]|c]表示法,还是我看错了?
发布于 2017-07-28 15:40:16
不过,我似乎找不到使用逗号和括号的对应符号。
没有相应的表示法,因为从技术上讲,这不是一个真正的列表。
Prolog有用于列表的语法糖。Prolog中的列表就像Lisp列表一样,实际上是一个链接列表:每个元素要么是空列表[],要么是节点.(H,T),H是头,T是尾。在Prolog中,列表不是“特殊”的,因为整数处理它们的方式与任何其他术语不同。当然,很多Prolog库都会处理列表,并使用上面定义的约定。
为了使复杂的列表更方便,语法糖被发明了。您也可以编写类似于.(H,T)的节点[H|T]。这意味着在你的[[a,b]|c]中。我们有一个外部列表,它有一个节点.(H,c),而?是另一个列表,有两个节点和一个空列表H = .(a,.(b,[]))。
从技术上讲,我不认为这是一个“真正的”列表,因为列表的尾部应该有另一个节点./2,或者一个空列表。
但是,您可以将它与诸如:[[a,b]|C]这样的变量一起使用,以便进一步统一尾部C。在这里,我们有一些以[a,b]作为第一个元素的列表(所以是包含一个列表的列表)和一个开放的尾部C。例如,如果我们稍后将C转到C = [],那么这个列表就是[[a,b]]。
https://stackoverflow.com/questions/45377264
复制相似问题