PROLOG 中的竖斜线函数到底是什么?是运营商吗?
What exactly is the vertical slash function in PROLOG? Is it an operator?
我正在研究 PROLOG 编程语言,测试一些示例并阅读文档。然后我开始对 PROLOG 中的列表进行大量研究。这个想法是:头和尾。然后我了解到列表可以像这样用 PROLOG 表示:
[Head | Tail]
语法非常简单,方括号中有头和尾,中间用斜线隔开|
。然后我问自己 PROLOG 中的垂直斜杠 |
的含义(语义)是什么。正如我所说,我也对列表和垂直斜杠进行了研究,但我找不到有用的东西。
所以这就是我有点困惑的原因。我想它确实是一个特殊字符,但为什么一定要是一个竖斜线呢?是运营商吗?它用于系统或语言(元)应用程序吗?它在语言中的具体作用是什么?
是的,|
是优先级为 1105 的右结合中缀运算符,右结合 表示像
这样的表达式
a|b|c|d
绑定为
'|'( a , '|'( b , '|'( c , d ) ) )
而不是左关联绑定
'|'( '|'( '|'( a , b ) , c ) , d )
它是 Prolog 列表符号语法糖的一部分。在 Prolog 中,任何非空列表都有一个单独的项目,表示为它的 head,列表的其余部分本身就是另一个列表(可能为空),表示为 tail。 (一个相当不错的递归定义,嗯?)
因此可以使用 |
轻松地将列表划分为 head 和 tail。所以
[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:
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.
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
我正在研究 PROLOG 编程语言,测试一些示例并阅读文档。然后我开始对 PROLOG 中的列表进行大量研究。这个想法是:头和尾。然后我了解到列表可以像这样用 PROLOG 表示:
[Head | Tail]
语法非常简单,方括号中有头和尾,中间用斜线隔开|
。然后我问自己 PROLOG 中的垂直斜杠 |
的含义(语义)是什么。正如我所说,我也对列表和垂直斜杠进行了研究,但我找不到有用的东西。
所以这就是我有点困惑的原因。我想它确实是一个特殊字符,但为什么一定要是一个竖斜线呢?是运营商吗?它用于系统或语言(元)应用程序吗?它在语言中的具体作用是什么?
是的,|
是优先级为 1105 的右结合中缀运算符,右结合 表示像
a|b|c|d
绑定为
'|'( a , '|'( b , '|'( c , d ) ) )
而不是左关联绑定
'|'( '|'( '|'( a , b ) , c ) , d )
它是 Prolog 列表符号语法糖的一部分。在 Prolog 中,任何非空列表都有一个单独的项目,表示为它的 head,列表的其余部分本身就是另一个列表(可能为空),表示为 tail。 (一个相当不错的递归定义,嗯?)
因此可以使用 |
轻松地将列表划分为 head 和 tail。所以
[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:
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 likenil
to denote the empty list but they didn't.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