assert(....)を使用して、指定された文脈自由文法をデータベースに挿入しまし た。文法が次のような場合
S-->a,S,b
S-->c
この文法はデータベースに挿入されます。データベースで cfg の文を生成するには、dcg を作成する必要があります。たとえば、この方法で dcg を定義した場合myDcg('S',str)、「S」 (非終端) を呼び出すか、aSbまたはc|dなどで置き換える必要があります。
問題は、文を生成するために非終端記号 ('S') に遭遇するたびに、データベースから事実によって'S'を呼び出す/置換する方法です。
私の質問を理解していただければ幸いです。そうでない場合は、質問を編集してみます。
以下(サンプルコード)はまさに私がやりたかったことですこれはdcgではありません。
myGrammar([], []):-!.
myGrammar([T|Rest], [T|Sentence]):-
myGrammar(Rest, Sentence).
myGrammar([NT|Rest], Sentence):-
grammar(NT, Rest1),
append(Rest1,Rest, NewRest),
myGrammar(NewRest, Sentence).
端末に遭遇するたびにそれを出力する必要があり、非端末に遭遇するとバックトラックします。