一些疑问与Prolog中的DCG语法和解析树关系有关

时间:2013-05-16 11:02:33

标签: prolog dcg

我正在使用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并生成解析树,其中句子为root

我试图解释如何仅使用之前的DCG语法形式构建解析树,而不是关于Prolog如何将此语法转换为一组规则(因为,对我来说这个事情很困难,也许是因为这样做我将再添加一步)

通过DCG语法而不是自动转换的规则读取它是一件好事吗?

所以我这样读:

句子 noun_phrase verb_phrase 组成,因此在DCG语法的第一个“规则”中我指定< strong>句子是我的树的根(代表我的自然语言子集中的一个句子),其中 noun_phrase 为左子, verb_phrase 为正确的孩子

然后 noun_phrase 被定义为确定者,后跟名词,因此 noun_phrase 是另一棵树的根将确定者作为左子,名词作为右子

然后,determininer是由单个节点组成的树: determininer(a)如果为TRUE,则找到的确定器为“a”或**确定器(the)如果为TRUE,则为发现确定者是“the”

我的* verb_phrase **

的推理相同

这是对的吗?

1 个答案:

答案 0 :(得分:2)

DCG形式的全部意义在于您不需要查看规范化形式,因此就是这样。

因此,使用DCG,您最终会得到一个表示,这对人类来说是非常简单的。

是的,您的解释是正确的。 Prolog似乎同意你的意见,因为它会让你回到你的期望。假设你没有看到任何警告,你应该好好去。也许尝试解析一些边缘情况,看看会发生什么?