Wahrheitstabelle



  • Hi, ich brauch bisschen Hilfe beim Aufbau eines zweidimensionalen Arrays.

    Als Input hab ich eine boolsche Gleichung z.B.:
    E1 = a1 && ! a2 || ! a1 && a2

    ich möchte jetzt die komplette Wahrheitstabelle in ein 2d Array schreiben. So sollte das dann aussehen ( am besten gleich ein bool Array[][] ):

    a1 / a2 / Gleichung_erg

    F / F / F
    T / F / T
    F / T / T
    T / T / F

    wobei ich jetzt false und true abgekürzt habe!

    Natürlich könnte ich das jetzt "per Hand" aufbauen, aber das wird mich nicht weiterbringen da der Nutzer ja verschiedene Gleichungen eingeben kann, die ein Algorithmus dann in eine Wahrheitswertetabelle/Array wandeln soll.



  • Um die eingegebenen booleschen Gleichungen verarbeiten zu können, benötigst du einen Parser - eventuell boost::spirit. Die einzelnen Wahrheitswerte kannst du dann in einer Schleife über alle t/f-Kombinationen (sind ja "nur" 2#Variablen) ermitteln.



  • Ach du sch...eibenkleister. Habe noch nie etwas geparst.
    Das boost::spirit tutorial hab ich mir gerade durchgelesen aber nur die Hälfte kapiert. Da muss ich wohl Regeln erstellen, aber was für Regeln wären das dann für meinen Fall von Gleichungen?



  • In deinem Fall würde ich mir erstmal einige Rechenklassen entwerfen, die die verschiedenen booleschen Operationen umsetzen - jede mit einer zentralen Berechnungsfunktion, die einen vector<bool> übernimmt und einen bool zurückgibt:

    struct boole_func
    {
      virtual bool calc(const vector<bool>& args) = 0;
    };
    
    class arg : public boole_func
    {
      size_t m_num;
    public:
      arg(size_t num) : m_num(num) {}
      virtual bool calc(const vector<bool>& args)
      {
        assert(m_num<args.size());
        return args[m_num];
      }
    };
    
    ...
    

    Als nächstes brauchst du einige Regeln, die in Spirit-EBNF beschreiben, wie eine boolesche Funktion aufgebaut ist - in den eingebauten Aktionen baust du dir dann eine dazu passende boole_func zusammen.
    (ich bin ein wenig aus der Übung - schau mal in der Spirit-Doku, wie das auszusehen hat)


Anmelden zum Antworten