C++ :: Aufgabe #319

1 Lösung Lösung öffentlich

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ß

Lösungen:

vote_ok
von JKooP (18090 Punkte) - 12.02.2021 um 07:43 Uhr
C++ 17

Main
Quellcode ausblenden C-Code
#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
Quellcode ausblenden C-Code
#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
Quellcode ausblenden C-Code
#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);
}