判定式の否定

 投稿者:しばっち  投稿日:2021年 1月 1日(金)18時16分59秒
  唐突ですが問題です。

IF A < 0 AND B = 0 OR C >= 5 THEN

この判定式の否定文、つまり IF NOT(A < 0 AND B = 0 OR C >= 5) THEN と
同等となる判定式はどうなるでしょう?

これは、IF 判定式 THEN 命令1 ELSE 命令2

命令1が不要になった場合等にIF NOT(判定式) THEN 命令2
以外の書き方を求めます。


IF 判定式 THEN ELSE 命令2
という書き方もできるようですが、ここではあくまでこの判定式を
否定した書き方を模索します。

これには、一定の規則性があります。

まず、
IF A = 0 THEN です。

この否定文は
IF NOT(A = 0) THEN ですがこれと同等の判定式は
IF A <> 0 THEN です。

また、IF A <> 0 THEN の否定文は
IF A = 0 THEN です。

次は
IF A < 0 THEN です。

この否定文は
IF NOT(A < 0) THEN ですが
IF A > 0 THEN ではありません。
これではA = 0 の場合が含まれていません。

IF A < 0 THEN の否定文は
IF A >= 0 THEN となります。

また
IF A >= 0 THEN の否定文は
IF A < 0 THEN です。

そして
IF A > 0 THEN の否定文は
IF A <= 0 THEN です。



※ ここまでのまとめ

A = B  の否定は A <> B  (A >< B)
A <> B の否定は A = B
A < B  の否定は A >= B  (A => B)
A > B  の否定は A <= B  (A =< B)
A <= B の否定は A > B
A >= B の否定は A < B


では次の2項の判定式ではどうなるでしょうか?
IF A = 0 AND B = 0 THEN

この否定文は
IF NOT(A = 0 AND B = 0) THEN ですが、先程の例から
IF A <> 0 AND B <> 0 THEN でしょうか?

A=0とB=0 以外の場合ですから
A=1,B=2 の場合はうまくいきそうです。

ですが IF A = 0 AND B = 0 THEN はA = 0でもB = 1では成り立ちません。
A=0 AND B=0の否定文ではA=0,B=1が成り立たなければなりません。

IF A <> 0 AND B <> 0 THEN ではA = 0の時、この A <> 0が成り立たずこの式は真になりません。
ですが

IF A <> 0 OR B <> 0 THEN ではA = 0でもB = 1なら成立するので真になります。
つまりANDをORに変えればうまくいきそうです。

そして
IF A <> 0 OR B <> 0 THEN の否定文 IF NOT(A <> 0 OR B <> 0) THEN は
IF A = 0 AND B = 0 THEN と同等になります。

次の6パターンを試してみると全て一致しているのが分かります。

FOR M=1 TO 6
   FOR D=0 TO 1
      FOR C=0 TO 1
         FOR B=0 TO 1
            FOR A=0 TO 1
               SELECT CASE M
               CASE 1
                  IF NOT(A = B OR C = D) THEN PRINT "NOT(A = B OR C = D) ";A;B;C;D
                  IF A <> B AND C <> D THEN   PRINT "A <> B AND C <> D   ";A;B;C;D
               CASE 2
                  IF NOT(A = B OR C <> D) THEN PRINT "NOT(A = B OR C <> D) ";A;B;C;D
                  IF A <> B AND C = D THEN     PRINT "A <> B AND C = D     ";A;B;C;D
               CASE 3
                  IF NOT(A < B OR C <> D) THEN PRINT "NOT(A < B OR C <> D) ";A;B;C;D
                  IF A >= B AND C = D THEN     PRINT "A >= B AND C = D     ";A;B;C;D
               CASE 4
                  IF NOT(A > B OR C = D) THEN PRINT "NOT(A > B OR C = D) ";A;B;C;D
                  IF A <= B AND C <> D THEN   PRINT "A <= B AND C <> D   ";A;B;C;D
               CASE 5
                  IF NOT(A <= B OR C < D) THEN PRINT "NOT(A <= B OR C < D) ";A;B;C;D
                  IF A > B AND C >= D THEN     PRINT "A > B AND C >= D     ";A;B;C;D
               CASE 6
                  IF NOT(A >= B OR  C<= D) THEN PRINT "NOT( A>= B OR C <= D) ";A;B;C;D
                  IF A < B AND C > D THEN       PRINT "A < B AND C > D       ";A;B;C;D
               END SELECT
            NEXT A
         NEXT B
      NEXT C
   NEXT D
   PRINT
NEXT M
END


否定文になると

AND は OR に
OR は AND に変わります。


では冒頭の問題を見てみましょう。
IF A < 0 AND B = 0 OR C >= 5 THEN

この否定文 IF NOT(A < 0 AND B = 0 OR C >= 5) THEN と同等の式はどうなるでしょうか?

これまでの例から

A < 0 は A >= 0 に
B = 0 は B <> 0 に
C >= 5 は C < 5 に
AND は OR に
OR を AND に変えて

IF A >= 0 OR B <> 0 AND C < 5 THEN と回答された方...




































































残念ながら間違いなのです。これは引っかけ問題なのです。


下記のプログラムを実行してみてください。

LET A=2
LET B=1
LET C=6
IF NOT(A < 0 AND B = 0 OR C >= 5) THEN PRINT "真 1" ELSE PRINT "偽 1"
IF A > =0 OR B <> 0 AND C < 5 THEN PRINT "真 2" ELSE PRINT "偽 2"
END


実は3項以上では注意点があります。










それはANDとORの優先順位です。

IF A < 0 AND B = 0 OR C >= 5 THEN これを正確に書くと
IF (A < 0 AND B = 0) OR C >= 5 THEN です。


よって正解は...


































IF (A >= 0 OR B <> 0) AND C < 5 THEN
になります。

これを間違えずに答えられた方はかなりのセンスの持ち主なのかもしれません。
チャン、チャン
 

戻る