ste*_*ten 5 prolog curly-brackets
Prolog中大括号的含义是什么:
{a,b,c}
Run Code Online (Sandbox Code Playgroud)
我知道可以使用它们,但是它们描述了元组还是什么?
谢谢..
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下载,使用{},以建设廉洁对象表示...
小智 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 中的大括号。
| 归档时间: |
|
| 查看次数: |
1356 次 |
| 最近记录: |