Hi all,
this mail is just to share a little program 'ttable' that prints the
truth table of a logical expression using the perl operators plus <=>
(equivalence) and => (implication). For example:
>> ttable "((A=>B)&&(B=>C)) => (A=>C)"
A B C | ((A=>B)&&(B=>C)) => (A=>C)
------------------------------------
0 0 0 | 1
0 0 1 | 1
0 1 0 | 1
0 1 1 | 1
1 0 0 | 1
1 0 1 | 1
1 1 0 | 1
1 1 1 | 1
At the heart, there is the code that is not optimized in any way.
$_ = shift;
$, = " ";
s/([a-z]+)/\$$1/ig;
@a{/(\$\w+)/g} = 1;
@v = sort keys %a;
($t="@v | $_") =~ s/\$//g;
s/<=>/==/g;
s/=>/<=/g;
($l=$t) =~ s/./-/g;
print "\n\t$t\n\t$l\n";
eval join "",(map{"for $_ (0,1){"[EMAIL PROTECTED]),"print \"[EMAIL PROTECTED] |
\",(",$_,")*1,\"\\n\"","}"[EMAIL PROTECTED], "\n";
print "\n";
How much more concise could it be, beyond removing needless spaces?
The main problem is that the <=> and => operators have higher
precedence than the not operator !. Any cool ideas to change that?
Cheers,
Etienne
PS : I attach the whole script, with pod included (it prints its own
documentation when run w/out argument).
--
Etienne Grossmann ------ http://www.cs.uky.edu/~etienne
#!/usr/bin/perl -w
exec "perldoc $0" unless @ARGV;
$_ = shift;
$, = " ";
s/([a-z]+)/\$$1/ig;
@a{/(\$\w+)/g} = 1;
@v = sort keys %a;
($t="@v | $_") =~ s/\$//g;
s/<=>/==/g;
s/=>/<=/g;
($l=$t) =~ s/./-/g;
print "\n\t$t\n\t$l\n";
eval join "",(map{"for $_ (0,1){"[EMAIL PROTECTED]),"print \"[EMAIL PROTECTED] |
\",(",$_,")*1,\"\\n\"","}"[EMAIL PROTECTED], "\n";
print "\n";
=head1 ttable - Print truth table of a logical proposition
Prints the truth table of a logical proposition in which variable names
consist of any number of consecutive letters, true is 1, false is 0,
and operators are
Not ! And && Or ||
in that order of precedence. You may also use
Then => Iff <=>
B<but their precedence is greater than that of "!" and they cannot be
chained>.
=head2 EXAMPLES
>> ttable 'A && (B || A)'
A B | A && (B || A)
---------------------
0 0 | 0
0 1 | 0
1 0 | 1
1 1 | 1
>> ttable '(B && (B || A)) <=> B'
A B | (B && (B || A)) <=> B
-----------------------------
0 0 | 1
0 1 | 1
1 0 | 1
1 1 | 1
=head1 AUTHOR Etienne Grossmann E<lt>[EMAIL PROTECTED]<gt>
If you have never seen unreadable code, read this program's.
=cut