Ternary logic: Difference between revisions
Content added Content deleted
No edit summary |
SqrtNegInf (talk | contribs) m (→{{header|Perl}}: a single file of runnable code) |
||
Line 4,269: | Line 4,269: | ||
=={{header|Perl}}== |
=={{header|Perl}}== |
||
⚫ | |||
File <TT>Trit.pm</TT>: |
|||
<syntaxhighlight lang="perl"> |
<syntaxhighlight lang="perl">use strict; |
||
use warnings; |
|||
use feature 'say'; |
|||
package Trit; |
|||
⚫ | |||
our @ISA = qw(Exporter); |
|||
use Exporter 'import'; |
|||
⚫ | |||
our @EXPORT_OK = qw(TRUE FALSE MAYBE is_true is_false is_maybe); |
|||
our %EXPORT_TAGS = ( |
|||
all => \@EXPORT_OK, |
|||
⚫ | |||
bool => [qw(is_true is_false is_maybe)], |
|||
); |
|||
use List::Util qw(min max); |
use List::Util qw(min max); |
||
Line 4,303: | Line 4,299: | ||
; |
; |
||
sub new |
sub new { |
||
my ($class, $v) = @_; |
|||
{ |
|||
my $ret = |
|||
!defined($v) ? 0 : |
|||
my $ret = |
|||
$v eq 'true' ? 1 : |
|||
$v eq 'false'? -1 : |
|||
$v eq 'maybe'? 0 : |
|||
$v > 0 ? 1 : |
|||
$v < 0 ? -1 : |
|||
0; |
|||
⚫ | |||
0; |
|||
⚫ | |||
} |
} |
||
Line 4,321: | Line 4,316: | ||
sub MAYBE() { new Trit( 0) } |
sub MAYBE() { new Trit( 0) } |
||
sub clone |
sub clone { |
||
my $ret = ${$_[0]}; |
|||
{ |
|||
return bless \$ret, ref($_[0]); |
|||
return bless \$ret, ref($_[0]); |
|||
} |
} |
||
sub tostr { ${$_[0]} > 0 ? |
sub tostr { ${$_[0]} > 0 ? 'true' : ${$_[0]} < 0 ? 'false' : 'maybe' } |
||
sub tonum { ${$_[0]} } |
sub tonum { ${$_[0]} } |
||
sub is_true { ${$_[0]} > 0 } |
|||
sub is_false { ${$_[0]} < 0 } |
|||
sub is_maybe { ${$_[0]} == 0 } |
|||
sub cmp { ${$_[0]} <=> ${$_[1]} } |
sub cmp { ${$_[0]} <=> ${$_[1]} } |
||
Line 4,339: | Line 4,329: | ||
sub or { new Trit(max(${$_[0]}, ${$_[1]}) ) } |
sub or { new Trit(max(${$_[0]}, ${$_[1]}) ) } |
||
sub equiv { new Trit( ${$_[0]} * ${$_[1]} ) } |
sub equiv { new Trit( ${$_[0]} * ${$_[1]} ) } |
||
File <TT>test.pl</TT>: |
|||
package main; |
|||
<syntaxhighlight lang="perl">use Trit ':all'; |
|||
Trit->import; |
|||
my @a = (TRUE(), MAYBE(), FALSE()); |
my @a = (TRUE(), MAYBE(), FALSE()); |
||
# prefix ! (not) ['~' also can be used] |
|||
say "a\tNOT a"; |
|||
print "$_\t".(!$_)."\n" for @a; # Example of use of prefix operator NOT. Tilde ~ also can be used. |
|||
⚫ | |||
# infix & (and) |
|||
⚫ | |||
for my $a (@a) { print $a; print "\t" . ($a & $_) for @a; say '' } |
|||
# infix | (or) |
|||
⚫ | |||
⚫ | |||
for my $a (@a) { |
|||
for my $a (@a) { print $a; print "\t" . ($a | $_) for @a; say '' } |
|||
print $a; |
|||
for my $b (@a) { |
|||
print "\t".($a & $b); # Example of use of infix & (and) |
|||
} |
|||
print "\n"; |
|||
} |
|||
# infix eq (equivalence) |
|||
⚫ | |||
⚫ | |||
for my $a (@a) { |
|||
for my $a (@a) { print $a; print "\t" . ($a eq $_) for @a; say '' } |
|||
print $a; |
|||
for my $b (@a) { |
|||
print "\t".($a | $b); # Example of use of infix | (or) |
|||
} |
|||
print "\n"; |
|||
} |
|||
⚫ | |||
for my $a (@a) { |
|||
print $a; |
|||
for my $b (@a) { |
|||
print "\t".($a eq $b); # Example of use of infix eq (equivalence) |
|||
} |
|||
print "\n"; |
|||
} |
|||
# infix == (equality) |
|||
⚫ | |||
say "\n==\t".join("\t",@a); |
|||
for my $a (@a) { |
|||
for my $a (@a) { print $a; print "\t" . ($a == $_) for @a; say '' }</syntaxhighlight> |
|||
print $a; |
|||
for my $b (@a) { |
|||
print "\t".($a == $b); # Example of use of infix == (equality) |
|||
} |
|||
print "\n"; |
|||
}</syntaxhighlight> |
|||
{{out}} |
{{out}} |
||
<pre>a NOT a |
<pre>a NOT a |