序言中的卷曲表情是什么意思?

ste*_*ten 5 prolog curly-brackets

Prolog中大括号的含义是什么:

{a,b,c}
Run Code Online (Sandbox Code Playgroud)

我知道可以使用它们,但是它们描述了元组还是什么?

谢谢..

Cap*_*liC 6

Prolog 几乎和 C 一样古老……从一开始,它就采用了一种特殊的语法方法。由于它是所谓的同音异义语言,所以一切都是一个术语。因此,我们确信这{a,b,c}也是一个术语。在我的旧 Prolog 解释器中,我将 '{' 和 '}' 作为一对单独的运算符处理,因此能够处理 DCG 规则,如Prolog附录 D中的 Clocksin/Mellish Programming 中所述(注意,我在谷歌上搜索了作者和标题,这本书是非官方的复制品,而且我用的那本书要旧得多,可能是 1985 年...)

让我们探索一些关于 SWI-Prolog REPL 的语法:

?- functor({a,b,c},F,N).
F = {},
N = 1.
Run Code Online (Sandbox Code Playgroud)

所以,{a,b,c}它只是一个化合物,a,b,c它的论点:

?- {a,b,c} =.. Syntax.
Syntax = [{}, (a, b, c)].
Run Code Online (Sandbox Code Playgroud)

在探索语法细节时,write_canonical帮助,但在这种情况下,它并没有让函子是什么:

?- write_canonical({a,b,c}).
{','(a,','(b,c))}
Run Code Online (Sandbox Code Playgroud)

一个值得注意的SWI-Prolog的扩展,http://stardict.sourceforge.net/Dictionaries.php下载,使用{},以建设廉洁对象表示...

  • 请注意,`write_canonical({a,b,c})` 应该写成`{}(','(a,','(b,c)))`。正如 YAP、SICStus、B、IF、GNU ...... (3认同)
  • 遗憾的是,这是 [SWI7 功能](http://www.complang.tuwien.ac.at/ulrich/iso-prolog/SWI7_and_ISO)。 (3认同)

小智 5

大括号 ({}) 可用于将正常的 Prolog 目标与定语从句语法预处理器隔离。因此,大括号之间的内容可以是任意 Prolog 代码,这些代码根本没有使用 DCG 规则进行预处理。

举个例子,假设您有以下规则来定义一个非常简单的语法:

sentence -->
    nounPhrase, verbPhrase.

nounPhrase -->
    det, noun,
    { write ('noun was found'), nl }.

verbPhrase -->
    verb, nounPhrase,
    { write ('verb was found'), nl }.
Run Code Online (Sandbox Code Playgroud)

写入的目标"noun was found""verb was found"与输入序列的消耗无关。因此,Prolog 允许您在大括号之间添加任何未预处理的目标。省略非预处理目标的大括号将会给您带来错误。

上面在 DCG 规则末尾添加的目标write只是大括号的作用的一个示例(在 DCG 中拥有目标没有实际用途write)。但这里有一个可能有助于改进解析器字典的示例:假设您希望语法能够区分单数和复数名词。一种选择是有一个额外的功能参数,例如:

noun(n(boy), singular) --> [boy].
noun(n(boy), plural) --> [boys].
Run Code Online (Sandbox Code Playgroud)

但是,当您向词汇表中添加越来越多的名词时,就会增加不必要的复杂性。您可以在大括号之间编写一条 Prolog 规则来检查您的名词是单数还是复数,如下所示:

n(n(NounSingular), Sgn_or_Pl) -->
    [Noun],
    { isNoun(Noun, NounSingular, Sgn_or_Pl) }.
Run Code Online (Sandbox Code Playgroud)

有关大括号有用性的完整描述,我建议阅读WF Clocksin、CS Mellish 的“Prolog 中的编程”第 8 章中的“添加额外测试”段落,可在此处获取Prolog 中的大括号