質問

指定されたコンテキストフリー文法をデータベースに挿入しました 主張する(....)文法が似ている場合

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

ターミナルに遭遇するときはいつでも、印刷する必要があり、非端子に遭遇するとバックトラックが発生します。

役に立ちましたか?

解決

あなたの述語で 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).

DCGS、ところで、この通訳よりも少し一般的です。

非ターミナルとターミナルの間の実際の分類は、トークン剤によって行われなければなりません。

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/2code_type/2 この目的のために。

uppercasecode(C) :-
   code_class(C, upper),
   code_class(C, prolog_var_start).

他のヒント

最近Prologを始めたと思います。はい、データベースに物事を主張することができますが、これはそもそもあなたがする一般的なことではありません。基本言語で安全だと感じるときは、その機能をずっと使用したいと思うでしょう。

あなたが通常することは、文法を次のようなファイルに書き込むことです myfirstgrammar.pl そのファイルをPrologシステムにロードします。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top