Parsen und Berechnen von Booleschen Set-Definitionen

8

Angenommen, ich habe ein Set S als String definiert, z. wie folgt:

%Vor%

wobei A, B und C endliche Mengen sind, z.B.:

%Vor%

Wenn wir S Schritt für Schritt analysieren, haben wir:

%Vor%

Das gibt uns das Endergebnis:

%Vor%

Wie kann ich die Elemente von S aufgrund ihrer Definition als allgemeine boolesche Formel berechnen?

Ich weiß nicht genau, wie ich anfangen soll, dieses Problem anzugehen. Auf der einen Seite frage ich mich, ob ich einen vollständigen lexikalischen Parser verwenden muss. Auch nach einigem Lesen habe ich zwei Konzepte gefunden, die sehr verwandt scheinen, aber nicht wissen, wie sie sich anwenden lassen:

Amelio Vazquez-Reina 11.03.2014, 02:56
quelle

2 Antworten

23

Sie müssen keinen eigenen Parser schreiben, wenn Sie S in einen String umwandeln möchten, der für eval () . Ändere S von '(A or B) and not(A and C)' in ein äquivalentes T , das Pythons in -Operator '(x in A or x in B) and not(x in A and x in C)' verwendet.

Berechnen Sie das Ergebnis, indem Sie das Universum der Elemente durchlaufen und testen, ob sie mit dem obigen Ausdruck übereinstimmen. Hier ist ein ausgearbeitetes Beispiel an der interaktiven Eingabeaufforderung:

%Vor%

Um die Umwandlung automatisch vorzunehmen, erstellen Sie einen Namespace für die Set-Variablen, in denen Variablen-Lookups einen Set-Membership-Test durchführen. Alles zusammen ergibt einen einfachen und sauberen Set-Expression-Evaluator:

%Vor%

Ich hoffe, das löst Ihr Problem und erspart Ihnen das Schreiben Ihres eigenen Parsers: -)

    
Raymond Hettinger 11.03.2014, 04:01
quelle
1

Was ich tun würde ist, den Rangierbahnhofsalgorithmus zu verwenden, um dies in umgekehrte Polnische Notation umzuwandeln und dann zu verwenden Dieser einfache Algorithmus dient zur Bewertung der Expression.

Da kein Parser benötigt wird, müssen Sie nur jedes Wort, Parens und Sonderzeichen, die die Definition bilden, erkennen, ohne "die Struktur des Satzes verstehen zu müssen".

    
radomaj 11.03.2014 03:00
quelle

Tags und Links