use strict; use warnings; use Algorithm::QuineMcCluskey; my $bool = 'Fred&Teddy&(Fred|Teddy)|(Fred)&(John)'; my @vars = keys %{{ map { $_ => 1 } $bool =~ /\b(\w+)\b/g }}; $bool =~ s/$vars[-$_]/vec(\$_,$_-1,1)/g for 1..@vars; my($result) = Algorithm::QuineMcCluskey->new( width => scalar @vars, minterms => [ grep { eval $bool } 0..2**@vars-1 ] )->solve(); $result =~ s/\+/|/g; $result =~ s/([A-Z])'/!$1/g; $result =~ s#([A-Z]+)# join( "&", map { $vars[ord($_)-ord("A")] } split //, $1 ) #ge; print "$result\n";