Phép tuyển
| Các toán tử logic | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
||||||||||||||||||||
| Khái niệm liên quan | ||||||||||||||||||||
| Ứng dụng | ||||||||||||||||||||
|
| ||||||||||||||||||||
Phép tuyển, hay còn gọi là phép hoặc logic hoặc hàm OR là một toán tử logic thường được ký hiệu bằng và đọc là "hoặc". Với hai mệnh đề và , phép tuyển có giá trị đúng khi ít nhất một trong hai mệnh đề là đúng, và chỉ sai khi cả hai đều sai.[1] Vì phép tuyển cho kết quả đúng ngay cả khi cả hai mệnh đề cùng đúng, nó còn được gọi là phép hoặc bao hàm (inclusive or), để phân biệt với phép tuyển loại (exclusive or, XOR) chỉ đúng khi đúng một trong hai mệnh đề.[1]
Phép tuyển được ký hiệu bằng trong logic học, trong điện tử học, và | hoặc || trong nhiều ngôn ngữ lập trình.[2]
Tính chất
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
Trong toán học và logic học, phép tuyển có thể được biểu diễn qua phép hội và phép phủ định theo định lý De Morgan:[2]
Phép tuyển có các tính chất đại số sau:[2]
- Kết hợp:
- Giao hoán:
- Phân phối:
- Lũy đẳng:
- Phần tử trung hòa: (phép tuyển với sai giữ nguyên giá trị)
- Phần tử hấp thụ: (phép tuyển với đúng luôn cho kết quả đúng)
Lý thuyết tập hợp
Phép tuyển có mối liên hệ chặt chẽ với phép hợp trong lý thuyết tập hợp: một phần tử thuộc hợp khi và chỉ khi nó thuộc hoặc thuộc , tức là .[3] Nhờ sự tương ứng này, phép tuyển thỏa mãn nhiều đẳng thức giống phép hợp tập hợp, bao gồm định lý De Morgan:
Ứng dụng trong khoa học máy tính
Phép toán thao tác bit
Trong lập trình hệ thống, phép tuyển bit (bitwise OR) được dùng phổ biến để "bật" (chuyển giá trị thành 1) các bit trong một số nhị phân. Nguyên lý là khi OR một giá trị với một mặt nạ bit (bit mask), các bit tương ứng với vị trí 1 trong mặt nạ sẽ được bật lên 1, trong khi các bit còn lại giữ nguyên.[4] Ví dụ, để bật bit cuối cùng của một số nguyên :
x = x | 0b00000001Kỹ thuật này được dùng rộng rãi trong lập trình nhúng và lập trình hệ thống để quản lý các cờ trạng thái (flags) khi mỗi bit trong một biến đại diện cho một trạng thái boolean độc lập, giúp tiết kiệm bộ nhớ so với dùng nhiều biến riêng lẻ.[4]
Toán tử logic trong lập trình
Nhiều ngôn ngữ lập trình phân biệt phép tuyển bit và phép tuyển logic bằng hai toán tử khác nhau. Trong các ngôn ngữ theo truyền thống C, phép tuyển bit dùng toán tử | (một gạch đứng), còn phép tuyển logic dùng || (hai gạch đứng).
Phép tuyển logic thường được đánh giá ngắn mạch (short-circuit evaluation): nếu toán hạng bên trái đã có giá trị đúng, toán hạng bên phải sẽ không được tính toán vì kết quả đã được xác định chắn chắn là đúng.[5] Ngoài ra, trong một số ngôn ngữ như Python và JavaScript, toán tử or / || không trả về giá trị boolean mà trả về chính toán hạng quyết định kết quả—toán hạng đầu tiên nếu nó có giá trị đúng, toán hạng thứ hai nếu toán hạng đầu tiên không đúng.[6] Tính năng này cho phép dùng || để cung cấp giá trị mặc định một cách ngắn gọn:
name = input_name or "Empty" # trả lại "Empty" nếu input_name rỗngNgôn ngữ tự nhiên
Trong tiếng Việt, cả phép tuyển và phép tuyển loại thật ra thường được dùng với cùng một từ "hoặc" hoặc là "hay", chẳng hạn như "Học sinh được khuyến khích xem lại các bài giảng hoặc làm các bài kiểm tra các năm trước để ôn thi" cho phép tuyển và "Mọi số tự nhiên đều là số chẵn hoặc số lẻ" cho phép tuyển loại. Tiếng Anh cũng gặp vấn đề tương tự với từ "or" mang cả hai nghĩa.[7]
Mặc dù vậy, trong ngôn ngữ học, từ "hoặc" thường hay được hiểu theo nghĩa loại trừ hơn một chút. Câu "Mary đang ăn táo hoặc lê" thường được hiểu là cô ấy chỉ ăn một trong hai, dù về mặt logic câu này vẫn đúng nếu cô ấy ăn cả hai. Hiện tượng này từng được giải thích là một hàm ý hội thoại (conversational implicature) theo lý thuyết hợp tác của Grice: người đáng ra có thể dùng "và" nếu biết cả hai đều đúng, nên người nghe suy ra chỉ có một cái đúng.[1][8]
Tuy nhiên, một số cấu trúc trong ngôn ngữ tự nhiên có thể sẵn nội hàm tính loại trừ, không cần sự suy luận gì hơn từ ngữ cảnh. Tiếng Hungary vagy...vagy và tiếng Pháp soit...soit là hai ví dụ trực quan: các cấu trúc này sẽ trở thành sai ngữ pháp trong những ngữ cảnh buộc phải đọc theo nghĩa bao hàm.[1]
Tham khảo
- ^ a b c d Aloni, Maria (2016). "Disjunction". Trong Zalta, Edward N. (biên tập). The Stanford Encyclopedia of Philosophy. Metaphysics Research Lab, Stanford University.
- ^ a b c Howson, Colin (1997). Logic with trees: an introduction to symbolic logic. London; New York: Routledge. tr. 38. ISBN 978-0-415-13342-5.
- ^ Ebbinghaus, Heinz-Dieter (2021). Einführung in die Mengenlehre (bằng tiếng Đức) (ấn bản thứ 5). Springer. tr. 32. ISBN 978-3-662-63865-1.
- ^ a b Bryant, Randal E.; O'Hallaron, David Richard (2011). Computer systems: a programmer's perspective (ấn bản thứ 2). Boston, Mass.: Prentice Hall. ISBN 978-0-13-610804-7.
- ^ "Python 3 Documentation — Boolean operations". docs.python.org (bằng tiếng Anh). Truy cập ngày 3 tháng 4 năm 2026.
- ^ "JavaScript Reference — Logical OR (". MDN Web Docs (bằng tiếng Anh). Truy cập ngày 3 tháng 4 năm 2026.
- ^ Felton, Casey; Jasbi, Masoud (ngày 24 tháng 1 năm 2025). "Non-Implicature Sources of Exclusivity in Linguistic Disjunction". Experiments in Linguistic Meaning (bằng tiếng Anh). Quyển 3. tr. 163–175. doi:10.3765/elm.3.5806. ISSN 2694-1791.
- ^ Grice, Paul (1975). "Logic and conversation". Trong Cole, P.; Morgan, J. (biên tập). Syntax and semantics. Quyển 3: Speech acts. New York: Academic Press. tr. 41–58.