A view from the highest point of the island
Hobby: Wahrheitstabellen per PowerShell ausgeben
Hobby

Hobby: Stunde der Wahrheit oder Wahrheitstabellen per PowerShell ausgeben

Die folgende Function wird vermutlich niemand jemals wirklich brauchen, ich finde sie trotzdem ganz nett, zumal sie ein weiteres Beispiel für “Power-Scripting” mit der PowerShell ist. Ich stelle im Folgenden eine Function vor, die sog. Wahrheitstabellen ausgibt. In einer solchen Tabelle werden auf der Grundlage der elementaren Regeln der Aussagenlogik (in meiner Fuction gibt es nur UND, ODER, EQV und IMP) logische $True/$False-Werte zu einem Ergebniswert verknüpft.

Nett ist an meiner Function, dass die Anzahl der Aussagenvariablen beliebig ist, es funktioniert mit A und B genau wie mit A, B, C, D und E usw.

Hier einfaches Beispiel für einen UND-Junktor:

A B R 0 0 0 0 1 0 1 0 0 1 1 1

Das Ergebnis ist nur dann 1, wenn alle verknüpften Variablen den Wert 1 besitzen.

Hier ist die Function:

<#
 .Synopsis
 Gibt eine Wahrheitstabelle aus
#>

function New-TruthTable
{
    param([String[]]$Values, [ValidateSet("UND","ODER", "EQV", "IMP")][String]$Junctor="UND")
    $Values += "R"
    $MaxValue = [Math]::Pow(2, $Values.Length - 1)
    $BinaryValue = [System.Convert]::ToString($MaxValue, 2)
    # Titelzeile ausgeben
    $ReplaceValue = '    $1    '
    ($Values -join "") -replace "(w)", $ReplaceValue
    # Zwischenzeile mit = -Zeichen
    New-Object -TypeName String -ArgumentList "=",(( ($ReplaceValue.Length - 1)  * $Values.Length + 3) - 3)
    for($i = $MaxValue - 1 ; $i -ge 0; $i--)
    {
        if ($i -gt 0)
        {
            $ZeroCount = [Math]::Floor([Math]::Log($MaxValue, 2)) - ([Math]::Floor([Math]::Log($i, 2)) + 1)
        }
        else
        {
            $ZeroCount = [Math]::Log($MaxValue, 2) - 1
        }
        # Spezialfall bei 1
        if ($i -ne 1)
        {
            $BinaryRow = [System.Convert]::ToString($i, 2) + (New-Object -TypeName String -ArgumentList "0", $ZeroCount)
        }
        else
        {
            $BinaryRow = (New-Object -TypeName String -ArgumentList "0", $ZeroCount) + [System.Convert]::ToString($i, 2)
        }
        # Ergebnis anhängen
        switch($Junctor)
        {
          "UND" {
                    $r = 1
                    foreach($B in $BinaryRow.ToCharArray())
                    {
                       $r = $r -band $B -eq "1"
                    }
            }
          "ODER" {
                    $r = 0
                    foreach($B in $BinaryRow.ToCharArray())
                    {
                       $r = $r -bor $B -eq "1"
                    }
            }
          "IMP" {
            # !A | B
                    $r = 1
                    foreach($B in $BinaryRow.ToCharArray())
                    {
                       $r = ([Byte]-not$r) -bor ($B -eq "1")
                    }
            }
          "EQV" {
                    $lastVal = $null
                    $r = 1
                    foreach($B in $BinaryRow.ToCharArray())
                    {
                        if ($lastVal -ne $null -and $lastVal -ne ($B -eq "1"))
                        {
                          $r = 0
                          break
                        }
                       $lastVal = $B -eq "1"
                    }
            }
            
        }
        $BinaryRow += $r
        # Zwischenraum einbauen
        $BinaryRow -replace "(d)", $ReplaceValue
    }
    $Binary

}

Aufgerufen wird die Function wie folgt:

New-TruthTable -Values A, B, C, E  -Junctor EQV

Nett wäre es natürlich, wenn man gleich eine “logische Formel” wie -A ^ B v C übergeben könnte. Interessant war bei der Umsetzung, dass es gar nicht so einfach ist per PowerShell eine “richtige” logische Verknüpfung durchzuführen, wenn die Operanden als String oder Char vorliegen. Um z.B. zu erreichen, dass ein 1 -OR 0 eine 1 und kein $true liefert, ist gleich wieder eine Typenkonvertierung erforderlich:

[Byte](1 -OR 0)

Ich glaube, ich hatte bereits erwähnt, dass das vermutlich niemals jemand benötigen wird, eine nette Übung (im Rahmen meines Studiums) war die Umsetzung trotzdem.