我是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:我试图用德语语法翻译这个例子,所以不要混淆;)
答案 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。
请注意,最好使用谓词短语/ [2,3]而不是使用等效谓词(实现可能会更改)。
正如larsmans所说,在这段代码中,名词应该在{}
之外