1

セマンティックスリーメソッドを使用して、命題論理式が有効か無効かを評価するプログラムを実行しようとしています。

これまでのところ、式が適切に形成されているかどうかを評価することができました。

from pyparsing import *
from string import lowercase

def fbf():

    atom = Word(lowercase, max=1) #alfabeto minusculas
    op = oneOf('^ V => <=>') #Operadores
    identOp = oneOf('( [ {')
    identCl = oneOf(') ] }')
    form = Forward() #Iniciar de manera recursiva
    #Gramatica
    form << ( (Group(Literal('~') + form)) | ( Group(identOp + form + op + form + identCl) ) | ( Group(identOp + form + identCl) ) | (atom) )

    return form

#Haciendo todo lo que se debe
entrada = raw_input("Entrada: ")
try:
    print fbf().parseString(entrada, parseAll=True)
except ParseException as error: #Manejando error
    print error.markInputline()
    print error
print

ここで、否定されたフォーラム ~(form) をモンガンの法則に従って変換する必要があります。モーガンの法則の BNF は次のようなものです。

~((form) V (form)) = (~(form) ^ ~(form))
~((form) ^ (form)) = (~(form) V ~(form))

http://en.wikipedia.org/wiki/De_Morgans_laws

解析は再帰的でなければなりません。私はParseactionsについて読んでいましたが、私はPythonに不慣れで非常に熟練していないことを本当に理解していません.

これを機能させる方法について誰かが私を助けることができますか?

4

1 に答える 1

1

フアン・ホセ -

あなたが気づいているかどうかにかかわらず、あなたはこの聴衆の側に多くの仕事を求めています. この問題を解決する方法について、いくつかの提案を次に示します。

  • 入力の解析は、このプログラム全体の最初のステップにすぎないことを認識してください。入力を通過するパーサーを書くだけで、次のステップの準備ができていると宣言することはできません。解析された出力で何をするかを予測し、次のステップに進む準備ができるようにデータを解析する必要があります。この場合、論理変換を行って DeMorgans の法則を適用します。実際、逆方向に作業するのが最善かもしれません - パーサーがあると仮定して、変換コードを操作するには何が必要で、式はどのように表示され、変換自体をどのように実行しますか? これにより、アプリケーション ドメインに対する思考が自然に構造化され、パーサーの作成を開始するときに目的の結果形式が得られます。

  • パーサーの作成を開始するときは、pyparsing wiki の SimpleBool.py など、同様のタスクを実行する他の pyparsing の例を参照してください。入力を解析して評価可能なオブジェクトのセットを作成する方法を確認してください。評価可能なオブジェクトのセットは、アプリケーション ドメインで処理できます (評価、変換など)。前のステップで概説した変換方法で機能する、パーサーで作成するオブジェクトの種類について考えてください。

  • 時間をかけて、解析する構文の BNF を記述してください。構文の問題を予測するために解析するサンプル テスト文字列をいくつか書き出します。「~~p ^ q V r」は有効な文字列ですか? 識別子を複数の文字にすることはできますか、それとも 1 文字だけに制限しますか (最初は 1 文字の方が扱いやすく、後で簡単に拡張できます)。()、[]、または {} の一致するペアの代わりに、グループ化のために () のみをサポートするなど、可能であれば構文を単純に保ちます。

  • パーサーを実装するときは、最初に単純なテスト ケースから始めて、徐々に進めていきます。より複雑な文字列がサポートされていないという仮定を早い段階で行ったことに気付いた場合は、少し後戻りする必要があるかもしれませんが、それはほとんどのプログラミング プロジェクトでよくあることです。

  • 実装のヒントとして、これらのタイプの解析ジョブ用に特別に設計された operatorPrecedence ヘルパーの使用について読んでください。入力文字列の構造を反映するオブジェクト階層を作成するために、SimpleBool.py でどのように使用されているかを見てください。次に、変換プロセスでオブジェクトが何をするかを考えてください。

幸運を!

于 2012-04-19T14:03:12.677 に答える