prolog中卷曲的brakets是什么意思?

时间:2015-09-07 06:25:55

标签: prolog curly-brackets

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

{a,b,c}

我看到我可以使用它们,但是它们是描述元组还是什么?

感谢..

2 个答案:

答案 0 :(得分:4)

Prolog从一开始就像C一样古老,它采用了一种特殊的语法方法。由于它是一个所谓的homoiconic language,它是一个术语,所以我们确信{a,b,c}它是一个术语......在我的old Prolog interpreter中,我处理了' {'和'}'作为一对独立的运算符,因此能够处理DCG规则,如Clocksin / Mellish Programming in Prolog附录D中所述(请注意,我搜索作者和标题,这本书是非正式的副本,我使用的书年纪大了,也许1985年......)

让我们探索SWI-prolog REPL的一些语法:

?- functor({a,b,c},F,N).
F = {},
N = 1.

所以,{a,b,c}它只是一个复合词,而a,b,c是它的论点:

?- {a,b,c} =.. Syntax.
Syntax = [{}, (a, b, c)].

write_canonical在探索语法详细信息时也会有所帮助,但在这种情况下,它并没有明白这个函子是什么:

?- write_canonical({a,b,c}).
{','(a,','(b,c))}

一个值得注意的SWI-Prolog扩展dicts,使用{}来构建一个干净的对象表示......

答案 1 :(得分:2)

Curly bracket {}可用于将正常的Prolog目标与Definite Clause Grammar预处理器隔离开来。所以大括号之间的东西可以是任意Prolog代码,它根本不是用DCG规则预处理的。

作为一个例子,让我们说你有以下规则来定义一个非常简单的语法:

  

句子 - > nounPhrase,verbPhrase。

     

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

     

verbPhrase - >动词,nounPhrase,{写('动词被发现'),nl}。

找到写作"名词的目标"或"动词被发现"与输入序列的消耗无关。所以Prolog允许你在花括号之间添加任何非预处理的目标。省略非预处理目标的大括号会给你一个错误。

&#39>写'在DCG规则结尾处添加的目标只是大括号所做的一个例子(在DCG中有一个'写'目标没有实际用途)。但是这里有一个例子可能对改进解析器的字典有用:假设你希望你的语法区分单数和复数名词。一种选择是拥有一个额外的功能参数,例如:

  

noun(n(boy),singular) - > [男孩]。

     

名词(n(男孩),复数) - > [男孩]。

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

  

n(n(NounSingular),Sgn_or_Pl) - > [Noun],{isNoun(Noun,NounSingular,Sgn_or_Pl)}。

有关花括号有用性的完整描述,我建议编写段落"添加额外测试"在第8章中" Prolog编程"作者:W。F. Clocksin,C。S. Mellish Curly Brackets in Prolog