www.mucker.at http://www.mucker.at Helmut Mucker de Die ganze Wahrheit: Boole'sches mit Perl http://www.mucker.at/2006//07#boolean <!-- amazon-search: Perl --> <!-- amazon-mode: books-de --> <!-- asin:1884777791 --> <p> 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 (<b>|</b> steht für <b>OR</b> und <b>&</b> für <b>AND</b>). Die Ausgabe ist ein Script, welches für den eingegebenen Ausdruch ein Script zur Erzeugung einer Wahrheitstabelle erzeugt. <!-- amazon_textlink:1884777791 --> <br><br> Ein kleines Beispiel dazu: Der Aufruf <pre> # bool.pl '(a | b) & c' </pre> liefert als Ausgabe das Perl-Script: <pre> 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"; } } } </pre> Führt man dieses Script aus, so erhält man als Ausgabe die folgende "Wahrheitstabelle" für <b>(a OR b) AND c</b>: <pre> 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 1 </pre> Natü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: <pre> #!/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]; } } </pre> </p>