4

私は人生のほぼすべて (約 20 年以上) をプログラミングしてきましたが、if ステートメントを見て「うーん、これは良い機会だろう」と思ったのは一度も思い出すことができないと思います。 XORを使用してください。」論理プログラミングの世界全体は、これら 3 つだけを中心に展開しているようです。

確かに、AND/OR/NOT ゲートを使用すると、他の論理ステートメントを作成できます。ただし、コードを節約して 2 つまたは 3 つのステートメントを 1 つの論理ステートメントに結合できる場合もあります。論理接続詞の可能な 16 の組み合わせを見てみましょう。

  1. FALSE = 矛盾 = 0、null、NOT TRUE
  2. TRUE = トートロジー = 1、NOT FALSE
  3. X = 命題 X = X
  4. NOT X = X の否定 = !X
  5. Y = 命題 Y = Y
  6. NOT Y = Y の否定 = !Y
  7. X AND Y = 結合 = NOT (X NAND Y)
  8. X NAND Y = 代替拒否 = NOT (X AND Y)、!X OR !Y
  9. X OR Y = 選言 = NOT (!X AND !Y)
  10. X NOR Y = 共同拒否 = NOT (X OR Y)、!X AND !Y
  11. X ⊅ Y = 重要な非含意 = X AND !Y, NOT(!X OR Y), (X XOR Y) AND X, ???
  12. X ⊃ Y = 重要な意味 = !X OR Y, NOT(X AND !Y), (X XNOR Y) OR X, ???
  13. X ⊄ Y = 逆非含意 = !X AND Y, NOT(X OR !Y), (X XOR Y) AND Y, ???
  14. X ⊂ Y = 逆含意 = X OR !Y, NOT(!X AND Y), (X XNOR Y) OR Y, ???
  15. X XOR Y = 排他的論理和 = NOT (X IFF Y)、NOT (X XNOR Y)、X != Y
  16. X XNOR Y = 二条件 = X IFF Y, NOT (X XOR Y), !X AND !Y

したがって、項目 1 ~ 2 には変数が含まれず、項目 3 ~ 6 には変数が含まれ、項目 7 ~ 10 は私たちがよく知っている用語です。(ただし、通常、NAND 演算子はありませんが、少なくとも Perl には、普遍的な NOT の「unless」があります。)

項目 11 から 14 は興味深い項目のように見えますが、これらはプログラミングで見たことがありません。項目 15 ~ 16 は XOR/XNOR です。

これらのいずれかを AND/OR/NOT 簡略化に使用できますか? もしそうなら、あなたはそれらを使ったことがありますか?

更新:「等しくない」または != は実際には XOR であり、常に使用されます。というわけで、やっぱりXORが使われています。

4

5 に答える 5

4

Not Equals/XOR の後にこの質問を閉じます。16 の可能な演算子のうち、プログラマーはそれらの 9 つを使用します。

FALSE, TRUE, X, Y, !X, !Y, AND (or ==), OR, XOR (or !=)

他のすべての演算子は通常、プログラミング言語には存在しません。

X NAND Y = Alternative Denial = NOT (X AND Y), !X OR !Y
X NOR Y = Joint Denial = NOT (X OR Y), !X AND !Y
X ⊅ Y = Material Nonimplication = X AND !Y, NOT(!X OR Y), (X XOR Y) AND X, ???
X ⊃ Y = Material Implication = !X OR Y, NOT(X AND !Y), (X XNOR Y) OR X, ???
X ⊄ Y = Converse Nonimplication = !X AND Y, NOT(X OR !Y), (X XOR Y) AND Y, ???
X ⊂ Y = Converse Implication = X OR !Y, NOT(!X AND Y), (X XNOR Y) OR Y, ???
X XNOR Y = Biconditional = X IFF Y, NOT (X XOR Y), !X AND !Y

NAND/NOR は非常に便利で、NOT (X xxx Y) と入力するよりもきれいに見えるため、後でそれらを使用する余地があるかもしれません。

于 2011-09-29T01:56:26.240 に答える
0

Java でプログラミングする場合、主に次の論理関数を使用する傾向があります。

  • いいえ!
  • &&
  • また||
  • xnor==
  • xor !=

これを他の基本機能に拡張します。

  • 重要な意味A || !B
  • 逆の含意!A || B
  • 重要な非含意!A && B
  • 逆非含意A && !B

xor と xnor をいつ使用するかを知ることは、論理を単純化することに帰着します。一般に、複雑な関数がある場合:

1) CNF (「接続正規形」別名「和積」) または DNF (「選言正規形」別名「和積」) のいずれかに単純化します。

2) 余分な用語を削除A && (A || B), A || (A && B) ->A

2) 単純化(A || !B) && (!A || B), (!A && !B) || (A && B)->A == B

3) 単純化(A || B) && (!A || !B), (A && !B) || (!A && B)->A != B

これら 3 つの簡略化を使用すると、xor 関数と xnor 関数の両方を使用して、よりクリーンなコードを作成できます。

*論理関数は、DNF では CNF よりもはるかに単純である場合もあれば、その逆の場合もあることに注意してください。

于 2015-11-03T07:57:27.680 に答える
0

このことを考慮:

  if(an odd number of conditions are true) then return 1 else return 0

and/or/not を使用して、試してみてください

  if(one is true || three are true || ... 2n+1 are true) then return 1 else return 0

条件のセットのサブセットである 1 セット、3 セット、5 セット、...、2n+1 セットのそれぞれを指定する必要があるため、これはかなり醜いです。ただし、XORバージョンはかなりエレガントです...

  if(C1 XOR C2 XOR ... XOR CN) then return 1 else return 0

大きいまたは可変の N の場合、これはおそらくループとカウンター システムで処理する方が適切ですが、N が大きすぎず (~10)、条件を配列としてまだ保存していない場合、これはそうではありません。残念。偶数個の条件をチェックする場合と同じように機能します。

他の人についても同様の例を思い付くことができます。興味深い演習は、次のようなプログラミングを試すことです

  if((A && !B) || (!A && B)) then return 1 else return 0

そして、コンパイラーが AND、OR、および NOT のアセンブリ言語を出力するかどうか、またはこれが XOR であることを認識するのに十分スマートであり、これに基づいて (おそらく安価な) XOR 命令を出力するかどうかを確認します。

于 2011-09-28T14:42:06.120 に答える
0

「項目 11 ~ 14 は興味深いもののように見えますが、プログラミングでこれらを見たことがありません。」
同意しません。項目 12、重要な含意は基本的に「IF」ステートメントであり、プログラミングのあらゆる場所にあります。重要な意味が次のように表示されます。

 if(A) {
    return B
 }
于 2019-01-14T07:45:41.913 に答える