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 s sein. Das "händische" Erstellen einer solchen Tabelle zur Bestimmmung 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  1
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:
#!/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];
  }
}

Alle Touren

Schneebergwege

Raxsteige

Geführte Touren

Perl

Literatur

Musik