0

我是 prolog 的新手,我尝试编写答录机。起初,我想弄清楚问了什么,并检查正确的语法。

question(P) --> [where],[is], article(G,K,N), location(P,G,K,N).
location(P,G,K,N) --> [P], {member(P, [bakery, mcdonalds, kfc, embassy]),noun(G,K,N)}.

article(m, akk, sg) --> [a].
article(f, akk, sg) --> [an].

noun(m, akk, sg) --> [bakery]|[mcdonalds]|[kfc].
noun(f, akk, sg) --> [embassy].

但我收到了这个错误:

question(What, [where,is,a,bakery],[]).
ERROR: location/6: Undefined procedure: noun/3
ERROR:   However, there are definitions for:
ERROR:         noun/5

但是,我发现 dcg 变量的最后两个参数是某种列表,但我真的没有找到关于该主题的任何内容......你有什么提示或解决方案给我吗?PS:我试图从德语语法中翻译示例,所以不要混淆;)

4

2 回答 2

1

location规则中,您将其放入noun内部{},因此它被视为普通的 Prolog 规则。把它放在外面{},你的语法“有效”(好吧,解析失败,但它不会抛出错误)。

location(P,G,K,N) --> [P], {member(P, [bakery, mcdonalds, kfc, embassy])},
                      noun(G,K,N).
于 2012-05-29T17:28:41.473 回答
0

一个“DCG 谓词”有两个“隐藏”参数;noun(G,K,N) 将是名词(G,K,N,L,R),其中 L 是输入列表,R 是识别名词后剩下的内容。

swi-prolog 相关手册页

请注意,最好使用谓词短语/[2,3] 而不是使用等效的谓词(实现可能会改变)。

正如 larsmans 所说,在这个代号中,名词应该在 {} 之外

于 2012-05-29T17:33:21.890 回答