0

私はプロローグが初めてで、留守番電話をプログラムしようとしています。最初は、何が求められているかを理解し、正しい構文をチェックするのが好きです。

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 変数の最後の 2 つの引数がある種のリストであることがわかりましたが、そのトピックについては何も見つかりませんでした...ヒントや解決策はありますか? PS: ドイツ語の文法から例を翻訳しようとしたので、混乱しないでください ;)

4

2 に答える 2

1

locationルールでは、通常のPrologルールのように扱われるように内部に配置しnounます。{}それを外に出す{}と、文法は「機能」します(まあ、解析は失敗しますが、エラーはスローされません)。

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

「DCG述語」には2つの「隠し」引数があります。noun(G,K,N) は noun(G,K,N,L,R) になります。ここで、L は入力リストであり、R は名詞が認識された後に残るものです。

swi-prolog 関連の man ページ

同等の述語を使用する代わりに、述語句/[2,3] を使用する方がよいことに注意してください (実装は変更される可能性があります)。

larsmans が言ったように、このコードでは名詞は {} の外にある必要があります

于 2012-05-29T17:33:21.890 に答える