我怎样才能在perl中实现这一点,快捷方便

时间:2018-03-12 03:51:32

标签: perl truthtable

我已将布尔函数的真值表简化为以下内容:

.pkg

修剪后的真值表:

A       B       C1      C2      Z
--------------------------------- 
0       0       0       0       1
0       0       0       1       1
0       0       1       0       1
0       0       1       1       1
0       1       0       0       1
0       1       0       1       1
0       1       1       0       1
0       1       1       1       1
1       0       0       0       1
1       0       0       1       1
1       0       1       0       1
1       0       1       1       1
1       1       0       0       1
1       1       0       1       0
1       1       1       0       0
1       1       1       1       0

我不知道如何修改创建A B C1 C2 Z --------------------------------- 0 0 0 x 0 x x x 0 0 1 x x 1 1 x 1 x 1 1 x x 1 1 1 而不是x1的真值表。

1 个答案:

答案 0 :(得分:1)

将矩阵转换为代码非常简单。

sub Z {
   my ($C2, $C1, $B2, $B1, $A) = @_;
   return 1 if $C2 && $C1;
   return 1 if $B2 && $B1;
   return 1 if $A;
   return 0 if !$C2 && !$B1 && !$A;
   return 0 if !$C1 && !$B1 && !$A;
   return 0 if !$C2 && !$B2 && !$A;
   return 0 if !$C1 && !$B2 && !$A;
   croak("Should never be reached");
}

由于所有可能的输入都将导致其中一个返回被执行,因此上述内容简化为:

sub Z {
   my ($C2, $C1, $B2, $B1, $A) = @_;
   return 1 if $C2 && $C1;
   return 1 if $B2 && $B1;
   return 1 if $A;
   return 0;
}

我们可以轻松地将其写为一行。

my $Z = $C2 && $C1 || $B2 && $B1 || $A;           # If $Z needs to be true or false.
my $Z = $C2 && $C1 || $B2 && $B1 || $A ? 1 : 0;   # If $Z needs to be 0 or 1 specifically.