Apakah ada kata kunci atau operator untuk “tidak”?

56

Apakah ada operator yang setara atau tidak ? Misalnya, warna favorit saya bukan hijau atau biru.

Dan kodenya akan setara dengan:

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

}

// example two
if (x nor y) {
    // x is false and y is false
}
1,21 gigawatt
sumber
12
Tidak, karena kami sudah memiliki ordan !, dan karena negatif ganda jarang digunakan - kebanyakan orang merasa sangat sulit untuk dibaca.
Kilian Foth
70
@KilianFoth benar. Namun demikian, downvotes harus untuk pertanyaan buruk, bukan untuk pertanyaan yang tidak kita sukai. Selain itu, sudah ada tiga suara untuk menutup pertanyaan karena itu akan "berdasarkan pendapat", meskipun pertanyaannya benar-benar netral dan tidak kontroversial (baik ada operator seperti itu dalam bahasa eksotis atau tidak ada).
Christophe
3
Apakah ada nama untuk itu? Ya: juga tidak. Apakah ini operator? Dalam bahasa apa? Dan diberi bahasa, Anda bisa mencarinya di spec / docs.
jonrsharpe
9
@Troyer Komentar Anda menunjukkan masalah: Anda salah logikanya. ;) Itu tidak setara dengan atau.
jpmc26
3
Dalam bahasa dengan lebih banyak operator, ini akan menjadi (misalnya, dalam python)color not in ['green', 'blue']
Izkata

Jawaban:

71

Meskipun bahasa umum tidak memiliki operator khusus NOR dan NAND, beberapa bahasa yang kurang dikenal (misalnya, beberapa bahasa "bermain golf") melakukannya. Misalnya, APL masing-masing memiliki dan untuk NOR dan NAND.

Kelas contoh lain dapat ditemukan dalam bahasa desain perangkat keras seperti VHDL , Verilog , dll. Gerbang NAND dan NOR cukup berguna dalam desain perangkat keras karena biasanya lebih murah (membutuhkan lebih sedikit transistor) daripada rangkaian setara yang dibuat dari DAN / ATAU / TIDAK. gerbang, yang merupakan salah satu alasan mengapa bahasa desain perangkat keras cenderung memasukkannya; alasan lain adalah bahwa mereka dapat berguna untuk trik-trik bit-fiddling tertentu.

nomadictype
sumber
40
APL bukan bahasa golf , melainkan bahasa berorientasi array yang memungkinkan pengembangan interaktif aplikasi multi-paradigma full-stack dengan kekuatan industri.
Adám
59
@ Adám: Bingo .
Eric Duminil
6
@EricDuminil :-) Tapi ini semua benar.
Adám
20
@EricDuminil Tidak, sungguh. APL bukan bahasa golf, ini bahasa praktis yang bagus untuk bermain golf. Perl serupa dalam hal ini, bukan?
Pavel
13
OP tidak benar-benar mengatakan bahwa APL adalah bahasa "golf", btw.
Will Crawford
45

Tidak, tidak ada noroperator dalam bahasa pemrograman arus utama tingkat tinggi.

Mengapa

Terutama karena sulit dibaca:

  • itu memerlukan kombinasi mental dari beberapa operator (" dan tidak ", atau dalam gaya yang lebih sastra: " lanjut negatif ", " masing-masing tidak benar " )
  • itu menyiratkan implisit notpada operan pertama, tetapi pembaca hanya memahami ini setelahnya
  • itu berbeda dari bahasa manusia, yang menggunakan negasi eksplisit pada operan pertama, seperti " bukan x atau y ", " atau x atau y ". Jadi pembaca mungkin bingung (x nor y)dengan (x and not y)alih - alih((not x) and (not y))
  • beberapa pembaca bingung dengan orsemantik semu yang tidak berlaku

Tapi itu sangat umum di perangkat keras ...

noradalah gerbang perangkat keras dasar yang dapat digunakan untuk membuat semua gerbang logis lainnya. Jadi orang dapat berargumen bahwa semua operator logika lainnya adalah kombinasi dan normerupakan operator logis elementer yang paling sederhana.

Namun, apa yang benar untuk perangkat keras belum tentu benar bagi manusia. Dan meskipun popularitasnya di tingkat perangkat keras, beberapa CPU arus utama bahkan tidak menawarkan NORdalam set instruksi assembler mereka (misalnya x86 ).

Alternatif

Masalah keterbacaan. Dan terkadang itu bisa diperbaiki dengan cara lain.

Penggunaan operator yang ada

Sebagai contoh:

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

Pemesanan kondisi

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

dari pada

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

Gunakan sampai loop

Beberapa bahasa juga menawarkan instruksi loop yang memungkinkan untuk mengekspresikan kondisi dengan whileatau dengan until, memungkinkan Anda memilih cara yang lebih "positif". Instruksi-instruksi ini misalnya until c do ...di ruby , do until c ...di vb , atau repeat ... until cdi pascal dan keturunannya.

Sebagai contoh:

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

setara dengan:

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

Buat suatu fungsi

Sekarang jika Anda masih lebih menyukai norsintaks, Anda bisa mendefinisikan suatu fungsi, tetapi hanya jika Anda tidak mengharapkan jalan pintas terjadi:

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

Ada keuntungan keterbacaan fungsi atas operator, karena pembaca segera memahami bahwa negasi berlaku untuk semua argumen. Dalam beberapa bahasa Anda dapat mendefinisikan suatu fungsi dengan sejumlah variabel argumen.

Christophe
sumber
5
Lucu, saya biasanya menulis bahwa ketika while (not (x == 1 or x == 2))saya menemukan x != 1 and x != 2versi yang sulit dibaca, dan menemukan "x bukan 1, atau 2" jauh lebih mudah untuk diproses daripada "x bukan 1, dan x bukan 2".
Mael
1
@Baldrickk, bisakah Anda menguraikan?
Semoga bermanfaat
4
@HopefullyHelpful Repeat... Untilselalu menjalankan loop body setidaknya sekali. Jika x adalah 1, badan loop masih dieksekusi, tetapi tidak diulang. The WhileLoop tidak akan mengeksekusi tubuh dalam kasus ini.
sina
2
@Baldrickk ya Anda sepenuhnya benar. Ketika saya menulis yang setara, saya hanya berbicara tentang kondisi loop, karena operator boolean adalah subjek pertanyaan. Terima kasih, saya akan reword untuk memperjelas
Christophe
3
Apakah x dan y in nor(x,y)selalu dievaluasi tergantung pada bahasa dan bagaimana nor()penerapannya. Ada bahasa (D, Io, ...) di mana fungsi yang dipanggil dapat memutuskan apakah dan kapan untuk mengevaluasi argumen.
BlackJack
18

Komentar @ KilianFoth pada pertanyaan tepat.

Anda dapat mensintesis nordari notdan or:

if (x nor y)

persis sama dengan

if (not (x or y))

Memperkenalkan norsebagai operator terpisah akan memperkenalkan redudansi pada bahasa, yang tidak diperlukan, atau diinginkan (atau - yang tidak diperlukan dan tidak diinginkan).

Demikian pula, saya tidak mengetahui ada bahasa yang memiliki nandoperator - mungkin karena dapat disintesis dari notdan andoperator.

Secara teori, Anda dapat membuat bahasa hanya dengan nandatau hanya noroperator. Semua and, ordan notkemudian dengan bisa synthesied dari mereka. Satu-satunya masalah adalah bahwa ini akan menjadi sangat sulit. Sebagai contoh, lihat logika NOR dan logika NAND di Wikipedia.

Mael
sumber
4
Redudansi juga tidak diperlukan atau diinginkan :)
Dave
@Dave Pun itu dimaksudkan, senang melihat Anda memperhatikan ;-)
Mael
5
Redudansi saja tidak benar-benar menjelaskan mengapa nortidak dimasukkan. Kalau tidak, mengapa bahasa memiliki anddan or? Mereka berlebihan, terima kasih kepada De Morgan. Bahkan, Anda bisa mengganti semua tiga operator logika konvensional ( and, or, not) dengan menyediakan hanya nor , seperti yang Anda benar diamati.
Konrad Rudolph
1
@KonradRudolph Secara teknis, yang Anda butuhkan hanyalah operator lambda . Alasan kami melakukan lebih banyak adalah untuk mencocokkan model mental yang kebanyakan programmer miliki. Sebagian besar programmer berpikir tentang logika and, ordan not- karena itulah yang digunakan oleh kebanyakan bahasa manusia. Setelah Anda mencocokkan model mental dan / atau / tidak, maka tidak akan menjadi berlebihan. Redundansi mereka bahkan dikodekan dalam nama mereka: "n (ot) dan" dan "n (ot) atau". Jika kami memiliki istilah bahasa Inggris yang berbeda, yang sudah ada sebelumnya untuk mereka, dan bukan hanya yang disintesis, maka Anda mungkin akan lebih sering melihatnya.
RM
1
Re redundansi sebagai argumen: Ada bahasa dengan lebih dari not, and, or. Misalnya beberapa dialek BASIC (GW-BASIC, QuickBASIC, ...) memiliki IMP eksklusif atau XOR, IMP (→ TIDAK (x XOR y)), dan EQV ekivalen (→ TIDAK (x) ATAU y) sebagai operator tambahan.
BlackJack
11

Ya, APL dan beberapa dialeknya juga tidak (dan nand ). Dalam APL, atau dilambangkan (karena adalah atau dan ~adalah tidak ):

 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

Cobalah online!

Adm
sumber
10

Jawaban ini berasal dari bahasa assembler untuk komputer yang dibuat pada pertengahan 1960-an. Itu cukup tidak jelas, tetapi dalam beberapa hal ini menjawab pertanyaan Anda.

DEC (Digital Equipment Corporation) meluncurkan komputer PDP-6 pada pertengahan 1960-an. Mesin ini memiliki total 64 instruksi yang merupakan operasi boolean pada dua operan (termasuk beberapa kasus degenerasi). 64 instruksi ini benar-benar 16 operator dengan 4 varian di setiap operator.

Dua operator, ANDCB dan ORCB masing-masing mengimplementasikan NOR dan NAND (kecuali saya tercampur pada logika negatif ganda). Anda dapat melihat tabel opcode . Tabel opcode sebenarnya untuk komputer PDP-10, penerus PDP-6.

Jika Anda melihat instruksi numerik dalam biner, itu menjadi lebih menarik. Ternyata untuk semua opcode dalam kisaran 400-477 (oktal), empat bit dalam instruksi itu sendiri menyediakan tabel kebenaran empat bit untuk 16 kemungkinan operator boolean. Beberapa operator mengabaikan satu atau kedua input. Misalnya SETZ dan SETO mengabaikan kedua input.

Para perancang PDP-6 mengeksploitasi fakta ini untuk mengimplementasikan semua instruksi ini dengan lebih sedikit logika daripada yang diperlukan untuk mengimplementasikan hanya beberapa dari mereka. Beberapa petunjuk ini jarang muncul, jika pernah, dalam kode bahasa assembly. Tetapi mereka semua ada di sana.

Jadi ANDCB adalah setara dengan NOR. (Sekali lagi, kecuali saya mendapatkan logika saya mundur, dalam hal ini ORCB adalah setara).

Walter Mitty
sumber
3

Perl memiliki unlesskata kunci yang memungkinkan Anda membalikkan persyaratan:

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

Meskipun bukan operator NOR, Anda dapat mengekspresikan niat Anda dengan cara yang sama.

Rory Hunter
sumber
3

The norOperator seperti yang Anda gambarkan itu tidak akan diulang, yang pasti akan menyebabkan banyak sulit untuk menemukan bug.

"Contoh 2" Anda pada dasarnya adalah ini:

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

Tetapi coba lagi dengan tiga variabel dan lihat apa yang terjadi:

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