在Prolog中花括号的含义是集合。花括号内的元素被视为一个无序的集合,可以用于匹配或生成解决方案。
我知道我可以使用它们,但它们是描述元组还是什么?
{a,b,c}
我知道我可以使用它们,但它们是描述元组还是什么?
{a,b,c}
{a,b,c}
也是一个术语。在我的旧Prolog解释器中,我将'{'和'}'处理为一对单独的操作符,因此能够处理DCG规则,如Clocksin/Mellish Programming in Prolog附录D中所述(注意,我是通过谷歌搜索作者和书名来获取这本书的非官方副本,而且我所用的书可能更老,可能是1985年...)。?- 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({a,b,c}).
{','(a,','(b,c))}
{}
来构建一个干净的对象表示形式...write_canonical({a,b,c})
应该改为写成{}(','(a,','(b,c)))
。这适用于 YAP、SICStus、B、IF、GNU等语言。 - false花括号 ({
和 }
) 可以用来将普通的Prolog目标与确定性子句语法预处理器隔离开来。因此,花括号之间的内容可以是任意的Prolog代码,只是不会被DCG规则预处理。
例如,假设您有以下规则来定义一个非常简单的语法:
sentence -->
nounPhrase, verbPhrase.
nounPhrase -->
det, noun,
{ write ('noun was found'), nl }.
verbPhrase -->
verb, nounPhrase,
{ write ('verb was found'), nl }.
noun(n(boy), singular) --> [boy].
noun(n(boy), plural) --> [boys].
但是,随着词汇量的增加,您添加的名词越多,就会增加不必要的复杂性。相反,您可以在花括号之间编写Prolog规则,以检查您的名词是单数还是复数,类似于以下内容:
n(n(NounSingular), Sgn_or_Pl) -->
[Noun],
{ isNoun(Noun, NounSingular, Sgn_or_Pl) }.