C# :: Aufgabe #346
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:
NET 3.x; C# 8.x
C#-Code
using System;
namespace CS_MDL_CORE_Dreiwertige_Logic_Operatorueberladung
{
enum Bool
{
True, False, Dark
}
class Program
{
static void Main(string[] args)
{
var w = new Logic(Bool.True);
var f = new Logic(Bool.False);
var u = new Logic(Bool.Dark);
// w OR (NOT u) |> True
Console.WriteLine(w | !u);
// u -> w |> True
Console.WriteLine(u != w);
// (u OR f) <-> (u -> (f AND (NOT u))) |> Dark
Console.WriteLine(u | f == u != f & !u);
}
}
class Logic
{
public Logic(Bool x) => X = x;
private Bool X { get; }
public override string ToString() => X.ToString();
public override bool Equals(object obj) => obj is Logic logic && X == logic.X;
public override int GetHashCode() => HashCode.Combine(X);
public static Logic operator &(Logic a, Logic b) => (a, b) switch
{
_ when a.X == Bool.False || b.X == Bool.False => new Logic(Bool.False),
_ when a.X == Bool.True && b.X == Bool.True => new Logic(Bool.True),
_ => new Logic(Bool.Dark)
};
public static Logic operator |(Logic a, Logic b) => (a, b) switch
{
_ when a.X == Bool.True || b.X == Bool.True => new Logic(Bool.True),
_ when a.X == Bool.False && b.X == Bool.False => new Logic(Bool.False),
_ => new Logic(Bool.Dark)
};
public static Logic operator !(Logic a) => a.X switch
{
Bool.True => new Logic(Bool.False),
Bool.False => new Logic(Bool.True),
_ => new Logic(Bool.Dark)
};
public static Logic operator !=(Logic a, Logic b) => !a | b; // Inklusion (a -> b)
public static Logic operator ==(Logic a, Logic b) => a != b & b != a; // Äquivalenz (a <-> b)
}
}
