「nor」のキーワードまたは演算子はありますか?


56

norに相当する演算子はありますか?たとえば、私の好きな色は緑でも青でもありません。

そして、コードは次と同等になります。

// example one
if (color!="green" && color!="blue") { 

}

// example two
if (x nor y) {
    // x is false and y is false
}

12
いいえ、既にとがorあり!、二重ネガはほとんど使用されないため、ほとんどの人は特に読みにくいと感じています。
キリアンフォス

70
@KilianFothは正しい。それにもかかわらず、下票は、私たちが好まない質問ではなく、悪い質問のためのものでなければなりません。さらに、質問は完全に中立で議論の余地のないにもかかわらず、「意見ベース」であるため、質問を終了するための3つの投票が既にあります(エキゾチックな言語にはそのような演算子があります)。
クリストフ

3
名前はありますか?はい:また。オペレーターですか?どの言語で?また、言語を指定すると、spec / docsで調べることができます。
jonrsharpe

9
@Troyerあなたのコメントは問題を示しています:あなたは論理が間違っていました。;)それはnorと同等ではありません。
jpmc26

3
より多くの演算子を持つ言語では、これは(たとえば、Pythonで)color not in ['green', 'blue']
-Izkata

回答:


71

主流の言語には専用のNORおよびNAND演算子がありませんが、あまり知られていない言語(たとえば、「ゴルフ」言語)にはあります。例えば、APLを有する、それぞれ、NORおよびNANDため。

別のクラスの例は、VHDLVerilogなどのハードウェア設計言語で見つけることができます。NANDおよびNORゲートは、通常はAND / OR / NOTで作成された等価回路よりも安価(必要なトランジスタが少ない)であるため、ハードウェア設計で非常に役立ちますハードウェア設計言語がゲートを含む傾向がある理由の1つであるゲート。もう1つの理由は、特定のビットをいじるトリックに役立つ可能性があることです。


40
APLはゴルフ言語ではなく、むしろ産業指向のフルスタックマルチパラダイムアプリケーションのインタラクティブな開発を可能にする配列指向の言語です。
アダム


6
@EricDuminil :-)それはすべて本当です。
アダム

20
@EricDuminilいいえ、本当に。APLはゴルフ言語ではなく、実際にゴルフが得意な実用的な言語です。Perlはこの点で似ています、違いますか?
パベル

13
OPは実際、APLが「ゴルフ」言語であるとは言いませんでした。
ウィルクロフォード

45

いいえ、nor高レベルの主流のプログラミング言語には演算子はありません。

どうして ?

主に読みにくいからです:

  • いくつかの演算子の精神的な組み合わせが必要です(「ではなく」、またはより文学的なスタイル:さらに否定的」、「それぞれが真実ではない
  • これnotは、最初のオペランドが暗黙的であることを意味しますが、読者は後でこれを理解するだけです
  • そのような「として第1オペランドに明示否定を使用する人間の言語とは異なるいずれのXもY」、「もXもY」。だから、読者は混乱かもしれない(x nor y)(x and not y)の代わりに、((not x) and (not y))
  • 一部の読者は、or当てはまらない明らかなセマンティックと混同されています

しかし、ハードウェアではとても一般的です...

norは、他のすべての論理ゲートを作成するために使用できる基本的なハードウェアゲートです。したがって、他のすべての論理演算子は組み合わせでnorあり、最も単純な基本論理演算子であると主張できます。

ただし、ハードウェアに当てはまることは、必ずしも人間に当てはまるわけではありません。また、ハードウェアレベルでの人気にもかかわらず、一部のメインストリームCPUはNOR、アセンブラー命令セット(x86など)を提供していません。

代替案

可読性が重要です。また、他の方法で改善できる場合もあります。

既存の演算子の使用

例えば:

if x not in [1,2]    // use of 'in' or 'not in' operator instead of x!=1 and x!=2

条件の順序

if x==1 or x==2 
     action A
else 
     action B  

の代わりに

if x!=1 and x!=2 
    action B
else 
    action A

untilループの使用

一部の言語では、with whileまたはwithのいずれかで条件を表現できるループ命令も提供されてuntilおり、より「ポジティブな」方法を選択できます。これらの命令は、例えばある until c do ...ではルビーdo until c ...VB、またはrepeat ... until cパスカルとその子孫。

例えば:

Until (x==1 or x==2) do
     ...

と同等です:

While (x!=1 and x!=2)
    ...

機能を作る

まだnor構文を好む場合は、ショートカットが発生することを期待していない場合にのみ、関数を定義できます。

If ( nor(x,y) )   // attention, x and y will always be evaluated
    ...  

否定はすべての引数に適用されることを読者はすぐに理解するため、演算子よりも関数の方が読みやすいという利点があります。一部の言語では、可変数の引数を使用して関数を定義できます。


5
おかしい、私は通常、読みにくいバージョンwhile (not (x == 1 or x == 2))を見つけて、x != 1 and x != 2「xは1でも2でもない」という処理を「xが1ではなく、xが2ではない」よりもはるかに簡単だと書きます。
マエル

1
@Baldrickk、詳しく説明できますか?
うまくいけば

4
@HopefullyHelpful Repeat...はUntil常にループ本体を少なくとも1回実行します。xが1の場合、ループ本体は実行されますが、繰り返されません。Whileループは、この場合には、本体を実行しません。
シーナ

2
@Baldrickkはい、あなたは完全に正しいです。同等のものを書くとき、ブール演算子が問題の主題であったため、ループ条件についてのみ話していました。ありがとう、明確にするために言い直します
クリストフ

3
xとy in nor(x,y)が常に評価されるかどうかnor()は、言語と実装方法によって異なります。呼び出された関数が引数を評価するかどうか、いつ評価するかを決定できる言語(D、Io、…)があります。
ブラックジャック

18

質問に対する@KilianFothのコメントはスポットライトです。

あなたは合成することができますnorから、notor

if (x nor y)

とまったく同じです

if (not (x or y))

紹介nor( -たかっ必要とされていないではないか)別のオペレータとしては、どちらも必要なく、また求められていた言語に冗長性を、ご紹介します。

同様に、私が持つ任意の言語を認識していないですnand演算子を-それはから合成することができるからでしょうnotし、and事業者。

理論上は、演算子のみnandまたはnor演算子のみで言語を作成できます。、、およびのすべてはand、それらから合成されます。唯一の問題は、これが途方もなく扱いにくいことです。例については、WikipediaのNORロジックおよびNANDロジックを参照してください。ornot


4
冗長性も必要ないか、必要とされない可能性があります:)
デイブ

@デイブそのしゃれは、あなたが気づいたのを見てうれしいです;
マエル

5
冗長性だけでnorは、含まれない理由を実際に説明しません。それ以外の場合、言語にはなぜandandがあるのorですか?De Morganのおかげで冗長です。実際には、すべての3つの従来の論理演算子(置き換えることができand、をornot提供することで)ちょうど norあなたが正しく観察されるように、。
コンラッドルドルフ

1
@KonradRudolph技術的には必要なのはラムダ演算子だけです。私たちがもっとやる理由は、ほとんどのプログラマーが持っているメンタルモデルに合わせるためです。ほとんどのプログラマーは、ロジックをの観点から考えますandorそしてnot、それがほとんどの人間の言語が使用するものだからです。and / or / notのメンタルモデルに一致すると、nor&nandは冗長になります。それらの冗長性は、「n(ot)and」および「n(ot)or」という名前でエンコードされています。合成された用語だけでなく、既存の明確な既存の英語の用語がある場合は、おそらくより頻繁に表示されるでしょう。
RM

1
引数として冗長再:より多く持つ言語がありnotandor。たとえば、一部のBASIC方言(GW-BASIC、QuickBASICなど)には、排他的またはXOR、含意IMP(→NOT(x XOR y))、および等価EQV(→NOT(x)OR y)が追加の演算子としてあります。
ブラックジャック

11

はい、APLとその方言のいくつかにはnor(およびnand)があります。APLでは、示されている(以降であるか、~あるではありません)。

 resultExampleOne color
  :If (color'green')⍱(color'blue')
      result'warm'
  :Else
      result'cold'
  :EndIf


 resultExampleTwo(x y)
  :If xy
      result'x is false and y is false'
  :Else
      result'at least one of them is true'
  :EndIf

オンラインでお試しください!


10

この答えは、1960年代半ばに作られたコンピューターのアセンブラー言語からです。それはかなりあいまいですが、いくつかの点であなたの質問に対処します。

DEC(Digital Equipment Corporation)は、1960年代半ばにPDP-6コンピューターを発売しました。このマシンには、2つのオペランドに対するブール演算である合計64の命令がありました(一部の縮退した場合を含む)。これらの64の命令は、実際には各演算子に4つのバリアントを持つ16の演算子でした。

ANDCBとORCBの2つの演算子は、それぞれNORとNANDを実装しました(二重負論理で混乱しない限り)。オペコード表を見ることができ ます。オペコードテーブルは、実際にはPDP-6の後継であるPDP-10コンピューター用です。

バイナリの数値命令を見ると、より興味深いものになります。400〜477(8進数)の範囲のすべてのオペコードに対して、命令自体の4ビットが16のブール演算子の4ビットの真理値表を提供することがわかります。これらの演算子の一部は、入力の一方または両方を無視します。たとえば、SETZとSETOは両方の入力を無視します。

PDP-6の設計者は、この事実を利用して、これらの命令すべてを、それらの一部のみを実装する場合よりも少ないロジックで実装しました。これらの命令の一部は、アセンブリ言語コードにはめったに登場しませんでした。しかし、それらはすべてそこにありました。

したがって、ANDCBはNORと同等です。(ここでも、論理を逆にした場合を除き、ORCBは同等です)。


3

Perlには、unless条件を反転できるキーワードがあります。

unless ($color eq 'green' or $color eq 'blue') {
    # code
}

NOR演算子ではありませんが、同様の方法で意図を表現できます。


3

norあなたはそれを説明したように、オペレータは、バグを発見することは困難の多くにつながるにバインドされ、再現性ではないでしょう。

あなたの「例2」は本質的にこれです:

if (false nor false) {
becomes
if (true) {

ただし、3つの変数を使用してもう一度試して、何が起こるかを確認してください。

if (false nor false nor false) {
becomes
if ((false nor false) nor false) {
becomes
if (true nor false) {
becomes
if (false) {
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.