C# :: Aufgabe #346

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:01 Uhr
NET 3.x; C# 8.x
Quellcode ausblenden 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)
    }
}