我正在使用 Ivan Bratko 的书在 Prolog 中研究DCG 语法和解析树:“人工智能编程”
我对生成解析树的 DCG 语法的解释有些怀疑:
sentence(Number, sentence(NP, VP)) --> noun_phrase(Number, NP),
verb_phrase(Number, VP).
verb_phrase(Number, verb_phrase(Verb, NP)) --> verb(Number, Verb),
noun_phrase(_, NP).
noun_phrase(Number, noun_phrase(Det, Noun)) --> determiner(Number, Det),
noun(Number, Noun).
determiner(singular, determiner(a)) --> [a].
determiner(_,determiner(the)) --> [the].
noun(singular, noun(cat)) --> [cat].
noun(singular, noun(mouse)) --> [mouse].
noun(plural, noun(cats)) --> [cats].
noun(plural, noun(mice)) --> [mice].
verb(singular, verb(scares)) --> [scares].
verb(singular, verb(hates)) --> [hates].
verb(plural, verb(scare)) --> [scare].
verb(plural, verb(hate)) --> [hate].
例如,如果我可以执行以下查询:
[debug] ?- sentence(singular, Tree, [a, cat, scares, the, mice],[]).
Tree = sentence(noun_phrase(determiner(a), noun(cat)), verb_phrase(verb(scares), noun_phrase(determiner(the), noun(mice))))
这是 TRUE 并且生成一个以句子为根的解析树
我试图解释如何仅使用以前的 DCG 语法形式构建解析树,而不是关于 Prolog 如何将此语法转换为一组规则(因为,对我来说这件事很困难,也许是因为这样做我会将添加进一步的步骤)
通过DCG语法而不是自动转换的规则阅读它是一件好事吗?
所以我是这样读的:
一个句子由一个名词短语和一个动词短语组成,因此在 DCG 语法的第一个“规则”中,我指定该句子是我的树的根(代表我的自然语言子集中的一个句子),左边有一个名词短语child 和verb_phrase作为右孩子
然后noun_phrase被定义为一个限定词,后跟一个名词,所以noun_phrase是另一棵树的根,其确定词为左孩子,名词为右孩子
然后确定器是由单个节点组成的树:如果找到的确定器是“a”为真,则确定器(a)或如果找到的确定器是“the”为真,则为 **determiner(the)
我的 *verb_phrase** 的理由相同
这是对的吗?