检查句子的正确语法并获得语义

时间:2012-05-29 17:17:33

标签: prolog dcg

我是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变量的最后两个参数是某种列表,但我真的没有找到该主题...你有什么tipps或解决方案吗? PS:我试图用德语语法翻译这个例子,所以不要混淆;)

2 个答案:

答案 0 :(得分:2)

location规则中,您将noun放在{}内,因此它被视为普通的Prolog规则。把它带到{}之外,你的语法“有效”(好吧,解析失败了,但它不会引发错误)。

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

答案 1 :(得分:0)

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

swi-prolog related man page

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

正如larsmans所说,在这段代码中,名词应该在{}

之外