“Nor” için bir anahtar kelime veya operatör var mı?


56

Bir operatör eşdeğer var mı ne ? Örneğin, en sevdiğim renk ne yeşil ne de mavi.

Ve kod şuna eşdeğer olacaktır:

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

}

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

12
Hayır, çünkü zaten var orve !ve çift negatifler nadiren kullanılıyor - çoğu insan onları özellikle okunması zor buluyor.
Kilian Foth

70
@KilianFoth haklı. Bununla birlikte, indirmeler, sevmediğimiz sorular için değil, kötü sorular için olmalıdır. Ayrıca, soruyu tamamen kapatmak için zaten üç oy var, çünkü soru tamamen tarafsız ve tartışmasız olmasına rağmen (ya bazı egzotik bir dilde bu tür operatörler var ya da yok), “görüşe dayalı” olacaktır.
Christophe

3
Bunun için bir isim var mı? Evet: ne de Operatör mü? Hangi dilde? Ve bir dil verdiğinizde, teknik özelliklerde / belgelerde buna bakabilirsiniz.
jonrsharpe

9
@Troyer Yorumunuz sorunu gösteriyor: mantığı yanlış anladınız. ;) Bu norla eşdeğer değildir.
jpmc26

3
Daha fazla operatöre sahip dillerde, bu (örneğin, python color not in ['green', 'blue']
dilinde

Yanıtlar:


72

Her ne kadar ana diller özel NOR ve NAND operatörlerine sahip olmasa da, daha az bilinen diller (örneğin, bazı "golf" dilleri) vardır. Örneğin, APL sahiptir ve sırasıyla, NOR ve NAND.

VHDL , Verilog , vs. gibi donanım tasarım dillerinde başka bir örnek sınıf bulunabilir . NAND ve NOR kapıları, AND / OR / NOT'dan yapılan eşdeğer devreden daha ucuz (daha az transistör gerektirir) nedeniyle donanım tasarımında oldukça kullanışlıdır. donanım tasarım dillerinin onları içerme eğilimindeki nedenlerinden biri olan kapılar; Diğer bir neden ise, belirli bit hileli hileler için faydalı olmalarıdır.


40
APL bir golf dili değil, tam yığın çoklu paradigma uygulamalarının endüstriyel güçle etkileşimli olarak geliştirilmesine olanak sağlayan dizi odaklı bir dildir.
Ad

59
@ Adám: Bingo .
Eric Duminil

6
@EricDuminil :-) Hepsi doğrudur.
Ad

20
@EricDuminil Hayır, gerçekten. APL bir golf dili değildir, golf oynamakta başarılı olacak pratik bir dildir. Perl bu konuda benzer, değil mi?
Pavel,

13
OP aslında APL'nin “golf” dili olduğunu söylemedi, btw.
Crawford,

46

Hayır, norherhangi bir üst seviye mainstream programlama dilinde operatör yoktur .

Neden ?

Temelde okumak zor olduğu için:

  • birkaç operatörün zihinsel kombinasyonunu gerektirir (" değil " veya daha edebi bir tarzda: " daha olumsuz ", " her biri doğru " )
  • notilk işlenen üzerinde bir ima eder , ancak okuyucu bunu daha sonra anlar
  • ne x ne de y ”, “ ne x ne de y ” gibi ilk işlenende açık bir olumsuzlama kullanan insan dillerinden farklıdır . Yani bir okuyucu yanıltabilecek (x nor y)ile (x and not y)yerine((not x) and (not y))
  • Bazı okuyucular, orgeçerli olmayan anlamsal anlamlarla karıştırılmamıştır.

Ama donanımda çok yaygın ...

nordiğer tüm mantıksal kapıları yapmak için kullanılabilecek temel bir donanım kapısıdır . Böylece, diğer tüm mantıksal operatörlerin kombinasyonlar norolduğu ve en basit temel mantıksal operatör olduğu söylenebilir .

Ancak, donanım için doğru olan, mutlaka insanlar için doğru değildir. Ve donanım seviyesindeki popülaritesine rağmen, bazı ana CPU'lar NORmontajcı talimat setlerinde bile bir teklif sunmuyor (örneğin x86 ).

Alternatifler

Okunabilirlik önemlidir. Ve bazen başka yollarla da geliştirilebilir.

Mevcut operatörlerin kullanımı

Örneğin:

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

Koşulların sıralanması

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

onun yerine

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

Kadar döngü kullanımı

Bazı diller ayrıca, koşulları daha "olumlu" bir şekilde seçmenize izin veren whileveya ile birlikte ifade untiletmenize olanak sağlayan döngü talimatları da sunar . Bu talimatlar örneğin aşağıdaki gibidir until c do ...içinde yakut , do until c ...içinde fi veya repeat ... until ciçinde Pascal ve onun soyundan.

Örneğin:

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

eşittir:

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

Bir işlev yap

Şimdi, norsözdizimini hala tercih ediyorsanız , bir işlev tanımlayabilirsiniz, ancak yalnızca bir kısayol olmasını beklemiyorsanız:

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

İşlevin operatör üzerinden okunabilirlik avantajı vardır, çünkü okuyucu hemen olumsuzlamanın tüm argümanlara uygulandığını anlar. Bazı dillerde, değişken sayıda argüman içeren bir fonksiyon tanımlayabilirsiniz.


5
Komik, genellikle sürümü okumayı zor buldukça ve "x'in 1 veya 2 olmadığını" "x'in 1 olmadığı ve x'in 2 olmadığı" ndan daha kolay while (not (x == 1 or x == 2))bulduğu gibi yazarım x != 1 and x != 2.
Mael

1
@Baldrickk hazırlayabilir misiniz?
Umarım yardımcı olur

4
@HopefullyHelpful Repeat... Untilher zaman döngü gövdesini en az bir kere çalıştırır. X 1 ise, döngü gövdesi hala yürütülür, ancak tekrarlanmaz. Bu durumda Whiledöngü gövdeyi çalıştırmaz.
sina

2
@Baldrickk evet tamamen haklısın. Eşdeğer yazarken, boole işleçleri sorunun konusu olduğundan sadece döngü koşulundan bahsediyordum. Teşekkür ederim, netleştirmek için yeniden değerlendireceğim
Christophe

3
X ve y'nin nor(x,y)her zaman değerlendirilip değerlendirilmediği, dile ve nasıl nor()uygulandığına bağlıdır . Çağrılan işlevin argümanların ne zaman ve ne zaman değerlendirileceğine karar verebileceği diller (D, Io,…) vardır.
BlackJack

18

@ KilianFoth'un soru üzerine yaptığı yorum çok açık.

Sen sentezleyebilirler norgelen notve or:

if (x nor y)

tam olarak aynı

if (not (x or y))

Tanıtımı nor(- istediği gerekli değildir değildir ya) ayrı bir operatör olarak ne gerekli, ne de aranıyor dile fazlalıklar, getirecek.

Benzer şekilde, nandoperatör olan herhangi bir dilin de farkında değilim - büyük olasılıkla bu türden notve andoperatörlerden sentezlenebildiğinden .

Teorik olarak, sadece nandveya sadece noroperatörlerle bir dil oluşturabilirsiniz . All and, orve noto zamana kadar onlardan synthesied olabilir. Tek sorun, bunun gülünç derecede hantal olacağı yönünde. Örnekler için bkz . Wikipedia'da NOR mantığı ve NAND mantığı .


4
Artıklıklara da ihtiyaç duyulmamış ya da istenmemiş olabilir :)
Dave,

@Dave Bu punta, fark edildiğini görmekten memnun oldu ;-)
Mael,

5
Yalnızca fazlalıklar nor, neden dahil edilmediğini gerçekten açıklamıyor . Aksi halde diller neden andve or? Gereksiz, De Morgan sayesinde. Aslında, tüm üç geleneksel mantıksal operatörler (yerine olabilir and, or, notsağlayarak) sadece nor siz doğru görüldüğü gibi.
Konrad Rudolph

1
@KonradRudolph Teknik olarak ihtiyacınız olan tek şey bir lambda operatörü . Daha fazlasını yapmamızın nedeni çoğu programcının sahip olduğu zihinsel modelle eşleşmektir. Çoğu programcı açısından mantık düşünüyorum and, orve not- çoğu insan dilleri kullandığım şey çünkü. Ve / veya / değil / zihinsel modeliyle eşleştikten sonra, artık gereksiz de olur. Artıklıkları isimlerinde bile kodlanmıştır: "n (ot) ve" ve "n (ot) veya". Eğer onlar için önceden belirlenmiş İngilizce terimler varsa ve sadece sentezlenmiş terimler olmasaydı, muhtemelen onları daha sık göreceksiniz.
RM

1
Argüman olarak fazlalık Re: daha fazlası ile dil vardır not, and, or. Örneğin, bazı BASIC lehçelerinde (GW-BASIC, QuickBASIC,…) ek operatörler olarak özel veya XOR, uygulama IMP (→ NOT (x XOR y)) ve eşdeğer EQV (→ NOT (x) VEYA) bulunur.
BlackJack

11

Evet, APL ve bazı lehçeler de (ve nand ). APL olarak, ne de belirtilmektedir (itibaren olan ya da ve ~bir değil ):

 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

Çevrimiçi deneyin!


10

Bu cevap, 1960'ların ortalarında yapılan bir bilgisayarın assembler diline ait. Bu oldukça belirsiz, ancak bazı açılardan sorunuzu ele alıyor.

DEC (Digital Equipment Corporation), PDP-6 bilgisayarını 1960'ların ortalarında başlattı. Bu makinede, iki işlenen (bazı dejenere durumlar dahil) üzerinde boolean operasyonlar olan toplam 64 komut vardı. Bu 64 komut, her bir operatörde 4 varyant olan 16 operatördü.

Operatörlerden ikisi, ANDCB ve ORCB sırasıyla NOR ve NAND uyguladı (çift negatif mantığa karışmadığım sürece). Opcode tablosunu görebilirsiniz . Opcode tablosu aslında PDP-6'nın ardılı olan PDP-10 bilgisayarı içindir.

İkilikteki sayısal talimatlara bakarsanız, daha ilginç hale gelir. 400-477 (octal) arasındaki tüm opkotlarda, komuttaki dört bitin, 16 olası boolean operatörü için dört bitlik bir doğruluk tablosu sağladığı ortaya çıktı. Bu operatörlerin bazıları girişlerden birini veya her ikisini de yok sayar. Örneğin, SETZ ve SETO her iki girişi de yok sayar.

PDP-6'nın tasarımcıları bu gerçeği kullanarak, bu talimatların tamamını, yalnızca bazılarını uygulamak için gerekenden daha az mantıkla uygulamak için kullandı. Bu talimatların bazıları, hiç olmadığı takdirde, meclis dili kodunda çok nadir görülüyordu. Ama hepsi oradaydı.

Bu yüzden ANDCB, NOR'un eşdeğeridir. (yine, mantığımı geri almadığım sürece, bu durumda ORCB eşdeğerdir).


3

Perl, unlesskoşulluları tersine çeviren anahtar kelimeye sahiptir:

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

NOR operatörü olmasa da, niyetinizi benzer şekilde ifade edebilirsiniz.


3

Tanımladığınız noroperatör tekrarlanabilir olmayacaktır, bu da tespit edilmesi zor olan birçok hataya yol açar.

"Örnek 2" esasen şöyledir:

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

Ancak bunu üç değişkenle tekrar deneyin ve ne olduğunu görün:

if (false nor false nor false) {
becomes
if ((false nor false) nor false) {
becomes
if (true nor false) {
becomes
if (false) {
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.