Die ganze Wahrheit: Boole'sches mit Perl
Ein kleines Perl-Script kann bei der Erstellung von
Wahrheitstabellen für Boole'sche Ausdrücke sehr behilflich sein.
Das "händische" Erstellen einer solchen Tabelle zur Bestimmung
der Werte eines Boole'schen Ausdruckes kann ja bei mehr als vier
Variablen schon sehr aufwendig werden, da
die maximale Anzahl der Kombinationen
von Variablenbelegungen 2^n (n = Anzahl der Variablen) ist.
Mit dem kleinen Script "bool.pl" weiter unten ist es
möglich, die ganze Arbeit
von Perl erledigen zu lassen. Das Script akzeptiert als Eingabe
einen Boole'schen Ausdruck (| steht für OR und
& für AND). Die Ausgabe ist ein Script, welches
für den eingegebenen Ausdruch ein Script zur Erzeugung einer
Wahrheitstabelle erzeugt.
Ein kleines Beispiel dazu: Der Aufruf
# bool.pl '(a | b) & c'liefert als Ausgabe das Perl-Script:
print "a b c (a | b) & c\n";
foreach $a (0..1) {
foreach $b (0..1) {
foreach $c (0..1) {
print "$a $b $c ",(($a | $b) & $c),"\n";
}
}
}
Führt man dieses Script aus, so erhält man als
Ausgabe die folgende "Wahrheitstabelle" für (a OR b) AND c:
a b c (a | b) & c 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1 1 1 0 0 0 1 0 1 1 1 1 0 0 1 1 1 1Natürlich is es möglich, die Tabelle beispielsweise mit "eval" sofort ausgeben zu lassen, und den Aufruf zu vereinfachen. Der Fantasie sind ja bei Perl keine Grenzen gesetzt. Hier nun das Script:
#!/usr/bin/perl
use strict;
use warnings;
my %vars;
my @vars;
my $expr = $ARGV[0];
my $vars = $expr;
my $spc = 0;
my $line = "";
$vars =~ s/[\|\&\(\)]//g;
@vars = split /\s+/, $vars;
foreach (@vars) {
next if $vars{$_};
$vars{$_} = $_;
}
print "print \"";
foreach my $var (sort keys %vars) {
print "$var ";
}
print " $expr\\n\";\n\n";
foreach my $var (sort keys %vars) {
printspc(+2);
print 'foreach $'.$var." (0..1) {\n";
$expr =~ s/$var/\$$var/g;
$line .= "\$$var ";
}
printspc(0);
print "print \"$line \",($expr),\"\\n\";\n";
foreach my $var (sort {$b cmp $a} keys %vars) {
printspc(-2);
print "}\n";
}
sub printspc {
if ($_[0] < 0) {
$spc += $_[0];
print " " x $spc;
} else {
print " " x $spc;
$spc += $_[0];
}
}
