Prologのデータベースから事実を呼び出します
-
26-10-2019 - |
質問
指定されたコンテキストフリー文法をデータベースに挿入しました 主張する(....)文法が似ている場合
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/2
と code_type/2
この目的のために。
uppercasecode(C) :-
code_class(C, upper),
code_class(C, prolog_var_start).
他のヒント
最近Prologを始めたと思います。はい、データベースに物事を主張することができますが、これはそもそもあなたがする一般的なことではありません。基本言語で安全だと感じるときは、その機能をずっと使用したいと思うでしょう。
あなたが通常することは、文法を次のようなファイルに書き込むことです myfirstgrammar.pl
そのファイルをPrologシステムにロードします。
参照してください この最近のスレッド 文法に関する詳細については。