#!perl -w use strict; my @terms = ( '( ( T || F ) && T )', '( ( T || F ) && ( F && F ))' ); sub simplify { my( $term ) = @_; $term =~ s!\s+!!g; # eliminate all whitespace my $changed; do { $changed = 0; $changed ||= ($term =~ s!F\|\|!!g); #print "$term ($changed)\n"; $changed ||= ($term =~ s!\|\|F!!g); #print "$term ($changed)\n"; $changed ||= ($term =~ s!T\&\&!!g); #print "$term ($changed)\n"; $changed ||= ($term =~ s!\&\&T!!g); #print "$term ($changed)\n"; $changed ||= ($term =~ s!F\&\&!!g); #print "$term ($changed)\n"; $changed ||= ($term =~ s!\&\&F!!g); #print "$term ($changed)\n"; $changed ||= ($term =~ s!T\|\|!!g); #print "$term ($changed)\n"; $changed ||= ($term =~ s!\|\|T!!g); #print "$term ($changed)\n"; $changed ||= ($term =~ s!\(([FT])\)!$1!g); #print "$term ($changed)\n"; } while $changed; return $term } for my $t (@terms) { print "$t => " . simplify( $t ), "\n"; };