มีคำหลักหรือโอเปอเรเตอร์สำหรับ“ หรือ” หรือไม่?


56

มีผู้ประกอบการเทียบเท่าหรือไม่? ตัวอย่างเช่นสีโปรดของฉันไม่ได้เป็นสีเขียวหรือสีน้ำเงิน

และรหัสจะเทียบเท่ากับ:

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

}

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

12
ไม่มีเพราะเรามีอยู่แล้วorและ!และเพราะดับเบิลเนกาทีฟจะไม่ค่อยได้ใช้ - คนส่วนใหญ่พบพวกเขาอย่างหนักโดยเฉพาะอย่างยิ่งในการอ่าน
Kilian Foth

70
@KilianFoth ถูกต้อง อย่างไรก็ตาม downvote ควรเป็นคำถามที่ไม่ดีไม่ใช่คำถามที่เราไม่ชอบ นอกจากนี้มีสามคะแนนโหวตที่จะปิดคำถามเพราะมันจะเป็น "ความเห็นตาม" แม้จะเป็นคำถามที่เป็นกลางและไม่เห็นด้วย (ทั้งที่มีผู้ประกอบการดังกล่าวในภาษาแปลกใหม่
Christophe

3
มีชื่อไหม? ใช่: และ มันเป็นผู้ประกอบการหรือไม่ ภาษาอะไร และเมื่อได้รับภาษาคุณสามารถดูได้ใน spec / docs
jonrsharpe

9
@Troyer ความคิดเห็นของคุณแสดงให้เห็นถึงปัญหา: คุณผิดตรรกะ ;) นั่นไม่เท่ากับหรือ
jpmc26

3
ในภาษาที่มีโอเปอเรเตอร์มากกว่านี้จะเป็น (เช่นในไพ ธ อน)color not in ['green', 'blue']
Izkata

คำตอบ:


72

แม้ว่าภาษากระแสหลักไม่ได้มีตัวดำเนินการ NOR และ NAND เฉพาะภาษาที่รู้จักกันน้อยกว่า (ตัวอย่างเช่นภาษา "กอล์ฟ" บางภาษา) ทำ ตัวอย่างเช่นAPLมีและสำหรับ NOR และ NAND ตามลำดับ

อีกตัวอย่างของคลาสสามารถพบได้ในภาษาการออกแบบฮาร์ดแวร์เช่นVHDL , Verilog , ฯลฯ ประตู NAND และ NOR ค่อนข้างมีประโยชน์ในการออกแบบฮาร์ดแวร์เนื่องจากมักจะมีราคาถูกกว่า (ต้องใช้ทรานซิสเตอร์น้อยกว่า) จากวงจรเทียบเท่าที่ทำจากและ / หรือ / ไม่ ประตูซึ่งเป็นหนึ่งในเหตุผลที่ภาษาการออกแบบฮาร์ดแวร์มีแนวโน้มที่จะรวมพวกเขา; อีกเหตุผลหนึ่งที่พวกเขาสามารถเป็นประโยชน์สำหรับเทคนิคบิต - เล่นซอ


40
APL ไม่ได้เป็นภาษากอล์ฟแต่เป็นภาษาที่เน้นอาเรย์ซึ่งช่วยให้สามารถพัฒนาแอพพลิเคชั่นแบบหลายกระบวนทัศน์แบบเต็มสแต็คที่มีความแข็งแกร่งทางอุตสาหกรรม
อดัม

59
@ อาดัม: บิงโก
Eric Duminil

6
@EricDuminil :-) มันเป็นเรื่องจริง
Adám

20
@EricDuminil ไม่จริงๆ APL ไม่ใช่ภาษากอล์ฟ แต่เป็นภาษาที่ใช้งานได้จริง Perl มีความคล้ายคลึงกันในเรื่องนี้ไม่?
Pavel

13
โอพีไม่ได้บอกว่า APL เป็นภาษา“ กอล์ฟ” ภาษา btw
Will Crawford จะ

46

ไม่ไม่มีnorโอเปอเรเตอร์ในภาษาหลักระดับสูงใด ๆ

ทำไม

สาเหตุหลักมาจากการอ่านยาก:

  • มันต้องมีการผสมผสานทางจิตใจของตัวดำเนินการหลายอย่าง (" และไม่ใช่ " หรือในรูปแบบของวรรณกรรมมากกว่า: " ลบเพิ่มเติม ", " แต่ละเรื่องจริง " )
  • มันหมายถึงนัยnotในตัวถูกดำเนินการแรก แต่ผู้อ่านเข้าใจเพียงนี้ในภายหลัง
  • มันแตกต่างจากภาษามนุษย์ซึ่งใช้การปฏิเสธอย่างชัดเจนในตัวถูกดำเนินการแรกเช่น " ไม่ใช่ x หรือ y ", " หรือ x หรือ y " ดังนั้นผู้อ่านอาจสร้างความสับสนให้(x nor y)กับ(x and not y)แทน((not x) and (not y))
  • ผู้อ่านบางคนสับสนกับorความหมายที่ชัดเจนซึ่งไม่ได้ใช้

แต่มันเป็นเรื่องธรรมดาในฮาร์ดแวร์ ...

norเป็นเกทฮาร์ดแวร์พื้นฐานที่สามารถใช้สร้างประตูตรรกะอื่น ๆ ทั้งหมด ดังนั้นหนึ่งอาจโต้แย้งว่าตัวดำเนินการเชิงตรรกะอื่นทั้งหมดเป็นการรวมกันและnorเป็นตัวดำเนินการทางตรรกะพื้นฐานที่ง่ายที่สุด

อย่างไรก็ตามสิ่งที่เป็นจริงสำหรับฮาร์ดแวร์นั้นไม่จำเป็นต้องเป็นเรื่องจริงสำหรับมนุษย์ และแม้ว่ามันจะเป็นที่นิยมในระดับฮาร์ดแวร์ แต่ซีพียูหลักบางตัวไม่ได้เสนอ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

ใช้จนถึงวง

บางภาษายังมีคำแนะนำการวนซ้ำที่อนุญาตให้แสดงเงื่อนไขด้วยwhileหรือ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"
Mael

1
@Baldrickk คุณสามารถทำอย่างละเอียด?
หวังว่าช่วยได้

4
@HopefullyHelpful Repeat... Untilดำเนินการลูปร่างกายเสมออย่างน้อยหนึ่งครั้ง ถ้า x เป็น 1 ตัวลูปจะยังคงทำงาน แต่จะไม่ทำซ้ำ Whileห่วงจะไม่ดำเนินการร่างกายในกรณีนี้
sina

2
@Baldrickk ใช่คุณพูดถูก เมื่อฉันเขียนเทียบเท่าฉันเพียงพูดเกี่ยวกับเงื่อนไขวงเนื่องจากผู้ประกอบการบูลีนเป็นเรื่องของคำถาม ขอบคุณฉันจะใส่ชื่อใหม่เพื่ออธิบาย
Christophe

3
Wether x and y in nor(x,y)จะถูกประเมินเสมอขึ้นอยู่กับภาษาและวิธีnor()การใช้งาน มีภาษา (D, Io, …) ที่ฟังก์ชันที่เรียกว่าสามารถตัดสินใจได้ว่าจะประเมินอาร์กิวเมนต์เมื่อใดและเมื่อใด
BlackJack

18

@ ความคิดเห็นของ KilianFoth กับคำถามนั้นเป็นจุด

คุณสามารถสังเคราะห์norจากnotและor:

if (x nor y)

เหมือนกันทุกประการ

if (not (x or y))

การแนะนำnorในฐานะโอเปอเรเตอร์ที่แยกต่างหากจะแนะนำภาษาที่ซ้ำซ้อนซึ่งไม่จำเป็นและไม่ต้องการ (หรือ - ซึ่งไม่จำเป็นและไม่ต้องการ)

ในทำนองเดียวกันฉันไม่ได้ตระหนักถึงภาษาใด ๆ ที่มีnandโอเปอเรเตอร์ - อาจเป็นเพราะมันสามารถสังเคราะห์จากnotและandโอเปอเรเตอร์

ในทางทฤษฎีคุณสามารถสร้างภาษาด้วยตัวดำเนินการnandอย่างเดียวหรืออย่างเดียว norทั้งหมดand, orและnotก็จะโดย synthesied จากพวกเขา ปัญหาเดียวก็คือว่านี่จะเป็นสิ่งที่ไม่น่าขันอย่างน่าขัน ตัวอย่างเช่นดูตรรกะ NORและตรรกะ NANDบน Wikipedia


4
ความซ้ำซ้อนอาจไม่จำเป็นหรือไม่ต้องการ :)
Dave

@Dave ปุนที่ตั้งใจดีใจที่เห็นคุณสังเกตเห็น ;-)
Mael

5
ความซ้ำซ้อนเพียงอย่างเดียวไม่ได้อธิบายว่าทำไมnorไม่รวมอยู่ด้วย มิฉะนั้นทำไมภาษาถึงมีandและor? พวกเขาซ้ำซ้อนขอบคุณเดมอร์แกน ในความเป็นจริงคุณสามารถใช้แทนทั้งสามดำเนินการทางตรรกะธรรมดา ( and, or, not) โดยการให้เพียงแค่ norเป็นคุณสังเกตได้อย่างถูกต้อง
Konrad Rudolph

1
@KonradRudolph เทคนิคทั้งหมดที่คุณต้องเป็นผู้ประกอบการแลมบ์ดา เหตุผลที่เราทำมากขึ้นเพื่อให้ตรงกับรูปแบบจิตที่โปรแกรมเมอร์ส่วนใหญ่มี โปรแกรมเมอร์ส่วนใหญ่คิดว่าตรรกะในแง่ของand, orและnot- เพราะนั่นคือสิ่งที่ภาษาของมนุษย์ส่วนใหญ่ใช้ เมื่อคุณจับคู่แบบจำลองทางจิตของและ / หรือ / ไม่ก็จะไม่ & & กลายเป็นซ้ำซ้อน ความซ้ำซ้อนของพวกเขาถูกเข้ารหัสในชื่อ: "n (ot) และ" และ "n (ot) หรือ" หากเรามีคำศัพท์ภาษาอังกฤษที่ชัดเจนและมีอยู่ก่อนแล้วและไม่ใช่เพียงแค่คำที่ถูกสังเคราะห์คุณอาจเห็นบ่อยขึ้น
RM

1
เรื่องความซ้ำซ้อนเป็นอาร์กิวเมนต์: มีภาษาที่มีมากกว่าที่มีอยู่not, ,and orตัวอย่างเช่นภาษาเบสิกบางภาษา (GW-BASIC, QuickBASIC, ... ) มีเอกสิทธิ์หรือ XOR, ความหมาย IMP (→ไม่ (x XOR y)) และ EQV ที่เทียบเท่า (→ไม่ (x) หรือ y) เป็นโอเปอเรเตอร์เพิ่มเติม
BlackJack

11

ใช่APLและภาษาถิ่นบางภาษาไม่มีและ (และ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) เปิดตัวคอมพิวเตอร์ PDP-6 ในช่วงกลางทศวรรษ 1960 เครื่องนี้มีคำสั่งทั้งหมด 64 คำสั่งซึ่งเป็นการดำเนินการบูลีนบนตัวถูกดำเนินการสองตัว (รวมถึงกรณีที่เลวลงบางส่วน) 64 คำสั่งเหล่านี้เป็นตัวดำเนินการ 16 ตัวที่มี 4 รุ่นในแต่ละตัวดำเนินการ

ตัวดำเนินการสองตัว ANDCB และ ORCB ใช้ NOR และ NAND ตามลำดับ (เว้นแต่ว่าฉันจะผสมกับตรรกะเชิงลบสองเท่า) ท่านสามารถเข้าดู ตาราง opcode ตาราง opcode นั้นจริงสำหรับคอมพิวเตอร์ PDP-10 ซึ่งเป็นตัวตายตัวแทนของ PDP-6

ถ้าคุณดูคำสั่งเชิงตัวเลขเป็นเลขฐานสองมันน่าสนใจมากขึ้น ปรากฎว่าสำหรับ opcode ทั้งหมดในช่วง 400-477 (octal) สี่บิตในการสอนนั้นมีตารางความจริงสี่บิตสำหรับ 16 ตัวดำเนินการบูลีนที่เป็นไปได้ ตัวดำเนินการเหล่านี้บางส่วนไม่สนใจอินพุตหนึ่งหรือทั้งสอง ตัวอย่างเช่น 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) {

แต่ลองอีกครั้งด้วยตัวแปรสามตัวแล้วดูว่าเกิดอะไรขึ้น:

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.