C++ :: Aufgabe #319
1 Lösung

Ternäre Logik (Dreiwertige Logik)
Fortgeschrittener - C++
von JKooP
- 02.12.2020 um 17:20 Uhr
Statt der bekannten Wahrheitswerte TRUE (t) und FALSE (f) gibt es noch einen weiteren Wert: DON’T CARE (x).
Dies wird als Dreiwertige Logik bezeichnet.
für x gilt zusätzlich bei Junktoren zur bekannten Aussagenlogik:
Negation:
NOT x => x
Konjunktion:
t AND x => x
f AND x => f
x AND x => x
Disjunktion:
t OR x => t
f OR x => x
x OR x => x
und darüber hinaus:
Inklusion:
A -> B => (NOT A) OR B
Äquivalenz:
(A <-> B) => (A -> B) AND (B -> A)
Es soll ein Programm erstellt werden, mit dem es möglich ist,
die o.a. ternäre Logik - auch innerhalb von Inklusion und Äquivalenz - abzubilden.
Hier bieten sich zur Lösung des Problems sowohl Methoden bzw. Funktionen,
als auch, wenn es die Programmiersprache zulässt, Operatorüberladungen an.
Beispiele:
t OR (NOT x) == t
NOT(x) OR (NOT(t)) == x
x -> t == t
(x OR f) <-> (x -> (f AND (NOT x))) == x
Viel Spaß
Dies wird als Dreiwertige Logik bezeichnet.
für x gilt zusätzlich bei Junktoren zur bekannten Aussagenlogik:
Negation:
NOT x => x
Konjunktion:
t AND x => x
f AND x => f
x AND x => x
Disjunktion:
t OR x => t
f OR x => x
x OR x => x
und darüber hinaus:
Inklusion:
A -> B => (NOT A) OR B
Äquivalenz:
(A <-> B) => (A -> B) AND (B -> A)
Es soll ein Programm erstellt werden, mit dem es möglich ist,
die o.a. ternäre Logik - auch innerhalb von Inklusion und Äquivalenz - abzubilden.
Hier bieten sich zur Lösung des Problems sowohl Methoden bzw. Funktionen,
als auch, wenn es die Programmiersprache zulässt, Operatorüberladungen an.
Beispiele:
t OR (NOT x) == t
NOT(x) OR (NOT(t)) == x
x -> t == t
(x OR f) <-> (x -> (f AND (NOT x))) == x
Viel Spaß
Lösungen:
C++ 17
Main
C-Code
Logic.h
C-Code
Logic.cpp
C-Code
Main

#include "Logic.h" #include <iostream> #include <string> using namespace std; int main() { auto w{ Logic(Bool::True) }; auto f{ Logic(Bool::False) }; auto u{ Logic(Bool::Dark) }; // w OR (NOT u) |> True cout << (w | !u) << endl; // u -> w | > True cout << (u != w) << endl; // (u OR f) <-> (u -> (f AND (NOT u))) |> Dark cout << (u | f == u != f & !u) << endl; }
Logic.h

#pragma once #include <ostream> using namespace std; enum class Bool { True, False, Dark }; class Logic { private: Bool X; public: Logic(Bool x) { X = x; }; friend Logic operator&(Logic const&, Logic const&); friend Logic operator|(Logic const&, Logic const&); friend Logic operator!(Logic const&); friend Logic operator!=(Logic const&, Logic const&); friend Logic operator==(Logic const&, Logic const&); friend ostream& operator<<(ostream&, Logic const&); };
Logic.cpp

#include "Logic.h" string get_bool(Bool b) { switch (b) { case Bool::True: return "True"; break; case Bool::False: return "False"; break; default: return "Dark"; } } Logic operator&(Logic const& a, Logic const& b) { if (a.X == Bool::False || b.X == Bool::False) return Logic(Bool::False); else if (a.X == Bool::True && b.X == Bool::True) return Logic(Bool::True); else return Logic(Bool::Dark); } Logic operator|(Logic const& a, Logic const& b) { if (a.X == Bool::True|| b.X == Bool::True) return Logic(Bool::True); else if (a.X == Bool::False && b.X == Bool::False) return Logic(Bool::False); else return Logic(Bool::Dark); } Logic operator!(Logic const& a) { switch (a.X) { case Bool::True: return Logic(Bool::False); case Bool::False: return Logic(Bool::True); default: return Logic(Bool::Dark); } } Logic operator!=(Logic const& a, Logic const& b) { return Logic(!a | b); } Logic operator==(Logic const& a, Logic const& b) { return Logic(a != b & b != a); } ostream& operator<<(ostream& o, Logic const& v) { return o << get_bool(v.X); }