2017-12-02 7 views
0

文のリストをループし、文法的に正しいかどうかを検証しようとしています。文章は単語のリストです。これは次のようになります。DCGの任意の用語 "chracter(_)が期待どおりに機能しない

verifySen([]). 
verifySen([H|T]) :- 
    sentence(H,[]), 
    verifySen(T). 

verifySenにはリストのリストが入力されています。 sentence(H,[])は、何かが有効な文であるかどうかを確認しようとします。これが問題の原因です。

sentence --> subject_phrase, verb_phrase, {write('this IS a valid sentence'), nl}. 
    sentence --> anything, {write('this is NOT a valid sentence'),nl}. 
    anything --> [_], anything. 
    ... 

何かが有効な文ですが、何かが無効の文である場合にエラーを失敗し、生成したときのためにを作品コード:私の現在のDCGは次のようになります。私は得るstream '<stream>(000..random numbers...)' does not exist.

誰でも助言を与えることができますか?

+0

'[you、run]'が有効な文であるとします。あなたによると、 '[あなた、実行、xxxx]'は有効な文ではありませんが、それでもあなたはそれが1つだと書きます!これらのテストを1レベル上に書くと、これは起こりません。そして、文法へのインタフェースとして常に 'phrase(sentence、H)'を使います。 – false

+0

\t 'sentence - > subject_phrase、verb_phrase、{write( 'this is a sentence')、nl}に変更します。 \t文 - > [_]、!、{書き込み( 'これは文ではありません)、nl}。' これで問題は解決しますか?トレースはまた、何かが文ではないことを正しく検出したが、最初の単語がなくてもそれをテストしてテストすることを示しています。これは、[_]を使用するか、カットを使用しないことと関係がありますか? – nhz

+1

文法規則に '{}'を入れないでください! – false

答えて

0

私は何かの基本ケースがないと思うので、文が無効であれば、ストリームの終わりまで実行されて失敗します。

anything --> [_], anything. 
anything --> []. 
関連する問題