1

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). 

端末に遭遇するたびにそれを出力する必要があり、非端末に遭遇するとバックトラックします。

4

2 に答える 2

2

最近Prologを始めたと思います。はい、データベースに物事をアサートすることはできますが、これは最初から行う一般的なことではありません。後で、基本言語で安全だと感じたときに、その機能を使用することをお勧めします。

通常行うことは、のようなファイルに文法を書き込んでから、myfirstgrammar.plそのファイルをPrologシステムにロードすることです。

文法の詳細については、この最近のスレッドを参照してください。

于 2011-12-01T11:46:38.733 に答える
2

述語mygrammar/2には、最初の引数に非端末と端末のリストがあり、2 番目の引数に端末のリストがあります。2 番目の引数が最初の引数の形式であれば、おそらく成功するはずです。つまり、ここにあるのは本質的に DCG のメタ インタープリターです。いくつかの提案:

あなたのトークナイザーは現在生成しています。代わり[grammar('S',[a,'S',b]),grammar('S',[....]),..].に生成させてください。[grammar('S',[t(a),nt('S'),t(b)]),grammar('S',[....]),..]このようにして、何が終端で何が非終端であるかは明らかです。そして、ああ、それを削除してください!

myGrammar([], []).
myGrammar([t(T)|Rest], [T|Sentence]):-
   myGrammar(Rest, Sentence).
myGrammar([nt(NT)|Rest], Sentence):-
   grammar(NT, Rest1),
   append(Rest1,Rest, NewRest),
   myGrammar(NewRest, Sentence).

DCG、ところで、このインタープリターよりも少し一般的です。

非端末と端末の間の実際の分類は、トークナイザーによって行われる必要があります。

uppercasecode(C) :-
   between(0'A,0'Z,C).

lowercasecode(C) :-
   between(0'a,0'z,C).

chars (1 文字のアトム) を使用している場合はchar_code(Char, Code)、それらの間の変換に使用します。

完全な Unicode サポートはまだ始まったばかりです。Ⓐ のような特殊な文字は大文字ですが、識別子の一部にすることはできないため、非常に注意が必要です。しかし、現在SWIでそれを行う方法は次のとおりです。

uppercasecode(C) :-
   '$code_class'(C,upper),
   '$code_class'(C,id_start).

lowercasecode(C) :-
   '$code_class'(C,id_start),
   '$code_class'(C,id_continue),
   \+ '$code_class'(C,upper).

更新: それまでの間、この目的のためにchar_type/2とがあります。code_type/2

uppercasecode(C) :-
   code_class(C, upper),
   code_class(C, prolog_var_start).
于 2011-12-01T21:56:02.403 に答える