PROLOG 中的竖斜线函数到底是什么?是运营商吗?

What exactly is the vertical slash function in PROLOG? Is it an operator?

我正在研究 PROLOG 编程语言,测试一些示例并阅读文档。然后我开始对 PROLOG 中的列表进行大量研究。这个想法是:头和尾。然后我了解到列表可以像这样用 PROLOG 表示:

语法非常简单,方括号中有头和尾,中间用斜线隔开|。然后我问自己 PROLOG 中的垂直斜杠 | 的含义(语义)是什么。正如我所说,我也对列表和垂直斜杠进行了研究,但我找不到有用的东西。

所以这就是我有点困惑的原因。我想它确实是一个特殊字符,但为什么一定要是一个竖斜线呢?是运营商吗?它用于系统或语言(元)应用程序吗?它在语言中的具体作用是什么?

是的,| 是优先级为 1105 的右结合中缀运算符,右结合 表示像

这样的表达式
 a|b|c|d

绑定为

'|'( a , '|'( b , '|'( c , d ) ) )

而不是左关联绑定

'|'( '|'( '|'( a , b ) , c ) , d ) 

它是 Prolog 列表符号语法糖的一部分。在 Prolog 中,任何非空列表都有一个单独的项目,表示为它的 head,列表的其余部分本身就是另一个列表(可能为空),表示为 tail。 (一个相当不错的递归定义,嗯?)

因此可以使用 | 轻松地将列表划分为 headtail。所以

[Head|Tail] = [a,b,c,d]

结果

Head = a
Tail = [b,c,d]

来自我的回答here,

Prolog's list notation is syntactic sugar on top of very simple prolog terms. Prolog lists are denoted thus:

  1. The empty list is represented by the atom []. Why? Because that looks like the mathematical notation for an empty list. They could have used an atom like nil to denote the empty list but they didn't.

  2. A non-empty list is represented by the term ., where the first (leftmost) argument is the head of the list and the second (rightmost) argument is the tail of the list, which is, recursively, itself a list.

Some examples:

  • An empty list: [] is represented as the atom it is:

      []
    
  • A list of one element, [a] is internally stored as

      .(a,[])
    
  • A list of two elements [a,b] is internally stored as

      .(a,.(b,[]))
    
  • A list of three elements, [a,b,c] is internally stored as

      .(a,.(b,.(c,[])))
    

Examination of the head of the list is likewise syntactic sugar over the same ./2 notation:

  • [X|Xs] is identical to .(X,Xs)

  • [A,B|Xs] is identical to .(A,.(B,Xs))

  • [A,B] is (see above) identical to .(A,.(B,[]))

似乎有点混乱b/w列表模式匹配中常用的竖线||/2运算符的用法

我不熟悉其他序言,所以这可能是 swi-prolog 特定的。 '|' 的帮助指出 following:

help('|').
:Goal1 | :Goal2
    Equivalent to ;/2. Retained for compatibility only. New code should use ;/2.

因此,列表表示法中使用的|不是此运算符。

?- X = '[|]'(1, []).
X = [1].

?- X = '|'(1, []).
X =  (1| []).

?- [1] = '|'(1, []).
false.

?- [1] = '[|]'(1, []).
true.

如上所示,仅使用 | 只会创建一个复合词而不是列表。

以下使用 Univ =.. 并使其更加清晰。

?- X = '[|]'(a, '[|]'(b, [])).
X = [a, b].

?- [a, b, c] =.. X.
X = ['[|]', a, [b, c]].

?- deep_univ([a, b, c, d], X).
X = ['[|]', a, ['[|]', b, ['[|]', c, ['[|]', d, []]]]].

我使用了

中的 deep_univ/2