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);
}
