Logical operations: Difference between revisions

m (→‎{{header|Perl 6}}: updated output)
(141 intermediate revisions by 68 users not shown)
Line 1:
{{task|Basic Data Operations}} {{basic data operation}} [[Category:Simple]]
{{basic data operation}}
[[Category:Simple]]
 
;Task:
Write a function that takes two logical (boolean) values, and outputs the result of "and" and "or" on both arguments as well as "not" on the first arguments.
 
If the programming language doesn't provide a separate type for logical values, use the type most commonly used for that purpose.
 
If the language supports additional logical operations on booleans such as XOR, list them as well.
<br><br>
 
=={{header|11l}}==
<syntaxhighlight lang="11l">F logic(a, b)
print(‘a and b: ’(a & b))
print(‘a or b: ’(a | b))
print(‘not a: ’(!a))</syntaxhighlight>
 
=={{header|360 Assembly}}==
Assembler 360 offers a full set of opcodes for logical operations: or, and, xor (exclusive or).
The "not" can be done by inversing the branching: BNE (Branch Not Equal) instead of BE (Branch Equal).
An othe way to perform a not is to use a xor with the true value (X'FF').
<pre>
Op-codes
Or And Xor
--- --- ---
Memory to memory OC NC XC
Memory to register O N X
Immediate OI NI XI
</pre>
<br>An example:
<syntaxhighlight lang="360asm">* Logical operations 04/04/2017
LOGICAL CSECT
USING LOGICAL,R15
* -- C=A and B
MVC C,A C=A
NC C,B C=A and B
* -- C=A or B
MVC C,A C=A
OC C,B C=A or B
* -- C=not A
MVC C,A C=A
XI C,X'01' C=not A
* -- if C then goto e
CLI C,X'01' if C
BE E then goto e
XPRNT =C'FALSE',5
*
E BR R14
TRUE DC X'01'
FALSE DC X'00'
A DC X'01'
B DC X'00'
C DS X
PG DC CL80' '
YREGS
END LOGICAL</syntaxhighlight>
{{out}}
<pre>
FALSE
</pre>
 
=={{header|6502 Assembly}}==
There are no built-in boolean types; however, supporting the concept in software is trivial. Typically, the zero flag or the carry flag can act as a boolean, with zero being false and nonzero being true.
 
<syntaxhighlight lang="6502asm">LDA myBoolean
BNE isTrue
;code that would execute if myBoolean is false, goes here.
RTS
isTrue:
;code that would execute if myBoolean is true, goes here.
RTS </syntaxhighlight>
 
===Branches Based On Equality to Zero===
A logical AND can easily be implemented as a nested if. Here, we'll be executing the following pseudocode. For this example, all variables are one byte in size.
 
<syntaxhighlight lang="c">if(myValue == 3 && myOtherValue == 5){
myResult = true;
}</syntaxhighlight>
<syntaxhighlight lang="6502asm">LDA myValue
CMP #3
BNE .skip
 
;if we got to here, "myValue == 3" evaluated to true.
 
LDA myOtherValue
CMP #5
BNE .skip
 
;if we got to here, both "myValue == 3" and "myOtherValue" == 5 evaluated to true.
 
STA myResult ;any nonzero value is considered TRUE, so we've stored 5 into myResult.
 
.skip:</syntaxhighlight>
 
A logical OR is somewhat similar.
<syntaxhighlight lang="c">if(myValue == 3 || myOtherValue == 5){
myResult = true;
}</syntaxhighlight>
<syntaxhighlight lang="6502asm">LDA myValue
CMP #3
BEQ .doTheThing
 
;if not equal, check myOtherValue
 
LDA myOtherValue
CMP #5
BNE .skip
 
;if we got to here, either "myValue == 3" or "myOtherValue" == 5 evaluated to true.
 
.doTheThing:
STA myResult ;any nonzero value is considered TRUE, so we've stored 5 into myResult.
 
.skip:</syntaxhighlight>
 
Logical NOT is the easiest of all; just use the opposite branch condition.
 
===Using Bit Shifts===
Chances are, however, on an 8-bit computer like the 6502, rather than using an entire byte to represent a single variable, you're going to store up to 8 related booleans in a single byte. Variables such as these are often called "bit flags" and is very common for parameters that are passed to/from external hardware, such as joysticks, video display processors, or sound cards. Each bit typically represents a different yet related variable. For example, reading a one-button joystick returns 5 bits, one for the "fire button" and the 4 directions.
 
<i>Side note: For joysticks, it's actually more common for 0 to represent pressed and 1 to represent not pressed, but that's out of the scope of this task.</i>
 
For testing multiple bits, a simple <code>BNE</code> or <code>BEQ</code> won't cut it, as this doesn't tell you WHICH bits are 0 or 1, only that a 1 exists/doesn't exist somewhere in the byte (which, if you need that info specifically, can be a nice shortcut.)
In this example, we'll be testing the bottom 2 bits of the 8-bit variable "Flags", and we want to test if both bits are 1.
 
<syntaxhighlight lang="6502asm">LDA flags
LSR ;test the rightmost bit.
BCC .skip
LSR ;test the bit just to the left of the one we tested prior.
BCC .skip
 
;your code for what happens when both of the bottom 2 bits are 1, goes here.
 
.skip:</syntaxhighlight>
 
===Using BIT===
If we're testing the top 2 bits of a byte (usually referred to as bit 7 or 6) then there's a special method we can use. The BIT instruction sets the N flag to bit 7 of the tested byte, and the V flag to bit 6 of the tested byte.
<syntaxhighlight lang="6502asm">BIT myBitFlags
BMI .Bit7Set
BVS .Bit6Set</syntaxhighlight>
 
For this reason, it's a good strategy when designing a bit flags variable to put the bits you'll be testing the most in bit 7 or 6 so that you spend less time checking them.
 
 
=={{header|ACL2}}==
 
<langsyntaxhighlight lang="lisp">(defun logical-ops (a b)
(progn$ (cw "(and a b) = ~x0~%" (and a b))
(cw "(or a b) = ~x0~%" (or a b))
(cw "(not a) = ~x0~%" (not a))))</langsyntaxhighlight>
<br><br>
 
=={{header|Action!}}==
<syntaxhighlight lang="action!">BYTE FUNC Not(BYTE a)
IF a=0 THEN
RETURN (1)
FI
RETURN (0)
 
PROC Main()
BYTE a,b,res
 
FOR a=0 TO 1
DO
FOR b=0 TO 1
DO
res=a AND b
PrintF("%B AND %B=%B",a,b,res)
res=a OR b
PrintF("|%B OR %B=%B",a,b,res)
res=a ! b
PrintF("|%B XOR %B=%B",a,b,res)
res=Not(a)
PrintF("|NOT %B=%B%E",a,res)
OD
OD
RETURN</syntaxhighlight>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Logical_operations.png Screenshot from Atari 8-bit computer]
<pre>
0 AND 0=0|0 OR 0=0|0 XOR 0=0|NOT 0=1
0 AND 1=0|0 OR 1=1|0 XOR 1=1|NOT 0=1
1 AND 0=0|1 OR 0=1|1 XOR 0=1|NOT 1=0
1 AND 1=1|1 OR 1=1|1 XOR 1=0|NOT 1=0
</pre>
 
=={{header|Ada}}==
Line 19 ⟶ 193:
providing a direct link between logical and bitwise operations.
 
<langsyntaxhighlight lang="ada">procedure Print_Logic(A : Boolean; B : Boolean) is
begin
Put_Line("A and B is " & Boolean'Image(A and B));
Line 25 ⟶ 199:
Put_Line("A xor B is " & Boolean'Image(A xor B));
Put_Line("not A is " & Boolean'Image(not A));
end Print_Logic;</langsyntaxhighlight>
 
=={{header|Agda}}==
 
===Short version===
<lang agda>module AndOrNot where
<syntaxhighlight lang="agda">
module AndOrNot where
 
open import Data.Bool using (Bool ; false ; true ; _∧_ ; _∨_ ; not)
open import Data.Product using (_,_ ; _×_)
 
test : Bool → Bool → Bool × Bool × Bool
test xa yb = xayb , xayb , not x</lang>a
</syntaxhighlight>
 
e.g.
 
test true false ⇒ false , true , false
 
 
===Long version===
 
<syntaxhighlight lang="agda">
module AndOrNot where
 
 
-- This part is to compute the values
 
open import Data.Bool using (Bool ; false ; true ; _∧_ ; _∨_ ; not)
open import Data.Product using (_,_ ; _×_)
 
test : Bool → Bool → Bool × Bool × Bool
test a b = a ∧ b , a ∨ b , not a
 
 
-- This part is to print the result
 
open import Agda.Builtin.IO using (IO)
open import Agda.Builtin.Unit using (⊤)
open import Data.String using (String ; _++_)
open import Data.Bool.Show using (show)
 
get-and-or-not-str : Bool × Bool × Bool → String
get-and-or-not-str (t₁ , t₂ , t₃) =
"a and b: " ++ (show t₁) ++ ", " ++
"a or b: " ++ (show t₂) ++ ", " ++
"not a: " ++ (show t₃)
 
test-str : Bool → Bool → String
test-str a b = get-and-or-not-str (test a b)
 
postulate putStrLn : String → IO ⊤
{-# FOREIGN GHC import qualified Data.Text as T #-}
{-# COMPILE GHC putStrLn = putStrLn . T.unpack #-}
 
run : Bool → Bool → IO ⊤
run a b = putStrLn (test-str a b)
 
main : IO ⊤
main = run true false
 
 
--
-- This program outputs:
-- a and b: false, a or b: true, not a: false
--
</syntaxhighlight>
 
=={{header|Aikido}}==
 
<langsyntaxhighlight lang="aikido">
function logic(a,b) {
println("a AND b: " + (a && b))
Line 49 ⟶ 275:
println("NOT a: " + (!a))
}
</syntaxhighlight>
</lang>
 
=={{header|Aime}}==
 
<langsyntaxhighlight lang="aime">void
out(integer a, integer b)
{
Line 62 ⟶ 288:
o_integer(!a);
o_byte('\n');
}</langsyntaxhighlight>
 
=={{header|ALGOL 68}}==
 
<langsyntaxhighlight lang="algol68">PROC print_logic = (BOOL a, b)VOID:
(
# for a 6-7 bit/byte compiler #
Line 87 ⟶ 313:
printf(($"not a is "gl$, ¬ a)
printf(($"a not equivalent to b is "gl$, a ≠ b)
)</langsyntaxhighlight>
 
=={{header|ALGOL W}}==
<langsyntaxhighlight lang="algolw">procedure booleanOperations( logical value a, b ) ;
begin
 
Line 103 ⟶ 329:
write( a, " equ ", b, ": ", a = b );
 
end booleanOperations ;</langsyntaxhighlight>
 
=={{header|Amazing Hopper}}==
<syntaxhighlight lang="amazing hopper">
#include <hopper.h>
 
main:
a=0, b=1 // a and b have some values...
 
{"values A=",a,", B=",b} println
 
{"AND : ",a,b} and, println
{"OR : ",a,b} or, println
{"XOR : ",a,b} xor, println
{"NAND: ",a,b} nand, println
{"NOR : ",a,b} nor, println
{"NOT A: ",a}not, println
{"NOT B: ",b}not, println
x=-1,{3,3} rand array(x), mulby(10),ceil,gthan(5),mov(x)
y=-1,{3,3} rand array(y), mulby(10),ceil,gthan(5),mov(y)
 
{"\nArrays\nX:\n",x,"\nY:\n",y}println
 
{"AND :\n",x,y} and, println
{"OR :\n",x,y} or, println
{"XOR :\n",x,y} xor, println
{"NAND:\n",x,y} nand, println
{"NOR :\n",x,y} nor, println
{"NOT X :\n",x} not, println
{"NOT Y :\n",y} not, println
 
exit(0)
</syntaxhighlight>
{{out}}
<pre>
values A=0, B=1
AND : 0
OR : 1
XOR : 1
NAND: 1
NOR : 0
NOT A: 1
NOT B: 0
 
Arrays
X:
0 0 0
1 1 1
1 1 0
 
Y:
1 1 0
0 1 1
1 1 0
 
AND :
0 0 0
0 1 1
1 1 0
 
OR :
1 1 0
1 1 1
1 1 0
 
XOR :
1 1 0
1 0 0
0 0 0
 
NAND:
1 1 1
1 0 0
0 0 1
 
NOR :
0 0 1
0 0 0
0 0 1
 
NOT X :
1 1 1
0 0 0
0 0 1
 
NOT Y :
0 0 1
1 0 0
0 0 1
</pre>
 
=={{header|Apex}}==
<langsyntaxhighlight Javalang="java">boolean a = true;
boolean b = false;
System.Debug('a AND b: ' + (a && b));
Line 112 ⟶ 428:
System.Debug('NOT a: ' + (!a));
System.Debug('a XOR b: ' + (a ^ b));
</syntaxhighlight>
</lang>
 
=={{header|APL}}==
APL represents Boolean values using 1 and 0. This function takes Boolean arguments before it and after it—which may be arrays of Booleans—and returns an array consisting of arg1 AND arg2, arg1 OR arg2, NOT arg1, arg1 NAND arg2, arg1 NOR arg2, and arg1 XOR arg2, in that order.
<langsyntaxhighlight lang="apl"> LOGICALOPS←{(⍺∧⍵)(⍺∨⍵)(~⍺)(⍺⍲⍵)(⍺⍱⍵)(⍺≠⍵)}</langsyntaxhighlight>
 
=={{header|ARM Assembly}}==
{{works with|as|Raspberry Pi}}
<syntaxhighlight lang="arm assembly">
/* ARM assembly Raspberry PI */
/* program logicoper.s */
/* Constantes */
.equ STDOUT, 1
.equ WRITE, 4
.equ EXIT, 1
/* Initialized data */
.data
szMessResultAnd: .asciz "Result of And : \n"
szMessResultOr: .asciz "Result of Or : \n"
szMessResultEor: .asciz "Result of Exclusive Or : \n"
szMessResultNot: .asciz "Result of Not : \n"
szMessResultClear: .asciz "Result of Bit Clear : \n"
 
sMessAffBin: .ascii "Register value : "
sZoneBin: .space 36,' '
.asciz "\n"
 
/* code section */
.text
.global main
main: /* entry of program */
push {fp,lr} /* save 2 registers */
 
mov r0,#0b1100 @ binary value 1
mov r1,#0b0110 @ binary value 2
bl logicfunc
 
100: @ standard end of the program
mov r0,#0 @ return code
pop {fp,lr} @ restore 2 registers
mov r7,#EXIT @ request to exit program
swi 0 @ perform the system call
 
/******************************************************************/
/* logics functions */
/******************************************************************/
/* r0 contains the first value */
/* r1 contains the second value */
logicfunc:
push {r2,lr} @ save registers
mov r2,r0 @ save value 1 in r2
ldr r0,iAdrszMessResultAnd @ and
bl affichageMess
mov r0,r2 @ load value 1 in r0
and r0,r1
bl affichage2
ldr r0,iAdrszMessResultOr @ or
bl affichageMess
mov r0,r2
orr r0,r1
bl affichage2
ldr r0,iAdrszMessResultEor @ exclusive or
bl affichageMess
mov r0,r2
eor r0,r1
bl affichage2
ldr r0,iAdrszMessResultNot @ not
bl affichageMess
mov r0,r2
mvn r0,r1
bl affichage2
ldr r0,iAdrszMessResultClear @ bit clear
bl affichageMess
mov r0,r2
bic r0,r1
bl affichage2
100:
pop {r2,lr} @ restore registers
bx lr
iAdrszMessResultAnd: .int szMessResultAnd
iAdrszMessResultOr: .int szMessResultOr
iAdrszMessResultEor: .int szMessResultEor
iAdrszMessResultNot: .int szMessResultNot
iAdrszMessResultClear: .int szMessResultClear
/******************************************************************/
/* register display in binary */
/******************************************************************/
/* r0 contains the register */
affichage2:
push {r0,lr} /* save registers */
push {r1-r5} /* save other registers */
mrs r5,cpsr /* saves state register in r5 */
ldr r1,iAdrsZoneBin
mov r2,#0 @ read bit position counter
mov r3,#0 @ position counter of the written character
1: @ loop
lsls r0,#1 @ left shift with flags
movcc r4,#48 @ flag carry off character '0'
movcs r4,#49 @ flag carry on character '1'
strb r4,[r1,r3] @ character -> display zone
add r2,r2,#1 @ + 1 read bit position counter
add r3,r3,#1 @ + 1 position counter of the written character
cmp r2,#8 @ 8 bits read
addeq r3,r3,#1 @ + 1 position counter of the written character
cmp r2,#16 @ etc
addeq r3,r3,#1
cmp r2,#24
addeq r3,r3,#1
cmp r2,#31 @ 32 bits shifted ?
ble 1b @ no -> loop
 
ldr r0,iAdrsZoneMessBin @ address of message result
bl affichageMess @ display result
100:
msr cpsr,r5 /* restore state register */
pop {r1-r5} /* restore other registers */
pop {r0,lr}
bx lr
iAdrsZoneBin: .int sZoneBin
iAdrsZoneMessBin: .int sMessAffBin
 
/******************************************************************/
/* display text with size calculation */
/******************************************************************/
/* r0 contains the address of the message */
affichageMess:
push {fp,lr} /* save registers */
push {r0,r1,r2,r7} /* save others registers */
mov r2,#0 /* counter length */
1: /* loop length calculation */
ldrb r1,[r0,r2] /* read byte start position + index */
cmp r1,#0 /* if 0 it's over */
addne r2,r2,#1 /* else add 1 to the length */
bne 1b /* and loop */
/* so here r2 contains the length of the message */
mov r1,r0 /* address message in r1 */
mov r0,#STDOUT /* code to write to the standard output */
mov r7,#WRITE /* "write" system call */
swi #0 /* system call */
pop {r0,r1,r2,r7} /* restore other registers */
pop {fp,lr} /* restore 2 registers */
bx lr /* return */
 
 
</syntaxhighlight>
 
=={{header|Arturo}}==
<syntaxhighlight lang="rebol">logic: function [a b][
print ["a AND b =" and? a b]
print ["a OR b =" or? a b]
print ["NOT a = " not? a]
]
logic true false</syntaxhighlight>
 
{{out}}
 
<pre>a AND b = false
a OR b = true
NOT a = false</pre>
 
=={{header|Asymptote}}==
<syntaxhighlight lang="asymptote">bool a = true;
bool b = false;
 
write(a & b);
write(a && b); //(with conditional evaluation of right-hand argument)
write(a | b);
write(a || b); //(with conditional evaluation of right-hand argument)
write(a ^ b);
write(!a);</syntaxhighlight>
 
=={{header|AutoHotkey}}==
<syntaxhighlight lang="autohotkey">a = 1
<lang AutoHotkey>a = 1
b = 0
msgbox % "a and b is " . (a && b)
msgbox % "a or b is " . (a || b)
msgbox % "not a is " . (!a)</langsyntaxhighlight>
 
=={{header|Avail}}==
Avail provides logical operators to cover all possibilities of a two-argument truth table. (Hence there are 12 entries below, plus the 4 ommitted for the trivial <code>a</code>, <code>b</code>, <code>true</code>, and <code>false</code> = 2^4.)
<syntaxhighlight lang="avail">Method "logic ops_,_" is
[
a : boolean;
b : boolean;
|
Print: "not a: " ++ “¬a”;
Print: "not b: " ++ “¬b”;
Print: "a and b: " ++ “a ∧ b”;
Print: "a or b: " ++ “a ∨ b”;
Print: "a nand b: " ++ “a ↑ b”;
Print: "a nor b: " ++ “a ↓ b”;
Print: "a implies b: " ++ “a → b”; // = not a OR b
Print: "a is implied b b: " ++ “a ← b”; // = a OR not b
Print: "a does not imply b: " ++ “a ↛ b”; // = a AND not b
Print: "a is not implied by b: " ++ “a ↚ b”; // not a AND b
Print: "a xor b: " ++ “a ⊕ b”; // equivalent to a ≠ b
Print: "a biconditional b: " ++ “a ↔ b”; // equivalent to a = b
];</syntaxhighlight>
 
=={{header|AWK}}==
<langsyntaxhighlight lang="awk">$ awk '{print "and:"($1&&$2),"or:"($1||$2),"not:"!$1}'
0 0
and:0 or:0 not:1
Line 134 ⟶ 638:
and:0 or:1 not:0
1 1
and:1 or:1 not:0</langsyntaxhighlight>
 
=={{header|Axe}}==
<langsyntaxhighlight lang="axe">Lbl LOGIC
r₁→A
r₂→B
Line 143 ⟶ 647:
Disp "OR:",(A??B)▶Dec,i
Disp "NOT:",(A?0,1)▶Dec,i
Return</langsyntaxhighlight>
 
Note that unlike [[TI-83 BASIC]], the "and", "or", "xor", and "not(" tokens in Axe are bitwise operators, not logical operators.
 
=={{header|BASIC}}==
==={{header|BASIC256}}===
{{works with|QuickBasic|4.5}}
<syntaxhighlight lang="basic256">a = true
<lang qbasic>SUB logic (a%, b%) 'no booleans in BASIC...these are integers. 1 for true 0 for false.
PRINT a AND b
PRINT a OR b
PRINT NOT a
END SUB</lang>
 
=={{header|BASIC256}}==
<lang BASIC256>a = true
b = false
print a and b
print a or b
print a xor b
print not a</langsyntaxhighlight>
 
==={{header|BBC BASIC}}===
<langsyntaxhighlight lang="bbcbasic"> PROClogic(FALSE, FALSE)
PROClogic(FALSE, TRUE)
PROClogic(TRUE, FALSE)
Line 176 ⟶ 673:
PRINT a% " EOR " b% " = " a% EOR b% TAB(60);
PRINT " NOT " a% " = " NOT a%
ENDPROC</langsyntaxhighlight>
{{out}}
<pre>
Line 183 ⟶ 680:
-1 AND 0 = 0 -1 OR 0 = -1 -1 EOR 0 = -1 NOT -1 = 0
-1 AND -1 = -1 -1 OR -1 = -1 -1 EOR -1 = 0 NOT -1 = 0
</pre>
 
==={{header|Chipmunk Basic}}===
{{works with|Chipmunk Basic|3.6.4}}
false = 0 and any non-zero value is true
<syntaxhighlight lang="qbasic">
120 b1 = false 'value of 0
130 b2 = true 'value of 1
140 print b1 and b2
150 print b1 or b2
160 print b1 xor b2
170 print b1 eqv b2
180 print b1 imp b2
190 print not b2</syntaxhighlight>
 
==={{header|Commodore BASIC}}===
In Commodore BASIC the "logical" operators are actually bitwise operators; to enable the proper semantics when they're used for logic, true expressions return -1 (all bits set) and false expressions return 0 (all bits clear).
<syntaxhighlight lang="qbasic">10 A = -1
20 B = 0
30 PRINT A AND B
40 PRINT A OR B
50 PRINT (A AND (NOT B)) OR ((NOT A) AND B)
60 PRINT NOT A</syntaxhighlight>
{{out}}
<pre>0
-1
-1
0</pre>
 
{{works with|Commodore BASIC 7.0}}
Commodore BASIC version 7 for the C-128 added XOR, but it's a function, and for some reason was written to accept only unsigned (16-bit) numbers.
 
<syntaxhighlight lang="basic">70 PRINT XOR(1, 0)</syntaxhighlight>
{{out}}
<pre>1</pre>
 
==={{header|GW-BASIC}}===
PC-BASIC has no Boolean type and does not implement Boolean operators.
{{works with|PC-BASIC|any}}
{{works with|BASICA}}
<syntaxhighlight lang="qbasic">100 LET FALSE = 0
110 LET TRUE = -1
120 PRINT TRUE
130 PRINT FALSE
120 PRINT TRUE AND FALSE
150 PRINT TRUE OR FALSE
160 PRINT TRUE XOR FALSE
170 PRINT TRUE EQV FALSE
180 PRINT TRUE IMP FALSE
190 PRINT NOT TRUE
200 END</syntaxhighlight>
 
==={{header|IS-BASIC}}===
<syntaxhighlight lang="is-basic">100 LET A=-1
110 LET B=0
120 PRINT A AND B
130 PRINT A OR B
140 PRINT (A AND(NOT B)) OR((NOT A) AND B)
150 PRINT NOT A
160 PRINT 15 BAND 4
170 PRINT 2 BOR 15
180 PRINT (A BOR B)-(A BAND B) ! xor</syntaxhighlight>
 
==={{header|MSX Basic}}===
{{works with|MSX BASIC|any}}
<syntaxhighlight lang="qbasic">120 b1 = false 'value of 0
130 b2 = not false 'value of -1
140 print b1 and b2
150 print b1 or b2
160 print b1 xor b2
170 print b1 eqv b2
180 print b1 imp b2
190 print not b2</syntaxhighlight>
 
==={{header|QBasic}}===
{{works with|QBasic|1.1}}
No booleans in BASIC... these are integers. -1 for True 0 for False.
<syntaxhighlight lang="qbasic">b1 = -1
b2 = 0
PRINT b1 AND b2
PRINT b1 OR b2
PRINT NOT b1</syntaxhighlight>
 
==={{header|Yabasic}}===
<syntaxhighlight lang="yabasic">b1 = true //value of 1
b2 = false //value of 0
print b1 and b2
print b1 or b2
print not b1</syntaxhighlight>
 
==={{header|QuickBASIC}}===
{{works with|QuickBasic|4.5}}
<syntaxhighlight lang="qbasic">SUB logic (a%, b%) 'no booleans in BASIC...these are integers. 1 for true 0 for false.
PRINT a AND b
PRINT a OR b
PRINT NOT a
END SUB</syntaxhighlight>
 
==={{header|Quite BASIC}}===
<syntaxhighlight lang="qbasic">120 LET b1 = 0
130 LET b2 = -1
140 PRINT b1 AND b2
150 PRINT b1 OR b2</syntaxhighlight>
 
==={{header|FreeBASIC}}===
In addition to And, Or and Not FreeBASIC supports several other logical operators:
 
* XOr - Exclusive Or : true if both operands are different, false if they're the same
* Eqv - Equivalence : true if both operands are the same, false if they're different
* Imp - Implication : true unless the first operand is true and the second operand is false when it is false
 
 
There are also 'short-circuiting' operators:
 
* AndAlso - Same as AND but the second operand is only evaluated if the first is true
* OrElse - Same as OR but the second operand is only evaluated if the first is false
 
 
The following program illustrates the use of these operators:
 
<syntaxhighlight lang="freebasic">' FB 1.05.0 Win64
 
Sub logicalDemo(b1 As Boolean, b2 As Boolean)
Print "b1 = "; b1
Print "b2 = "; b2
Print "b1 And b2 = "; b1 And b2
Print "b1 Or b2 = "; b1 Or b2
Print "b1 XOr b2 = "; b1 Xor b2
Print "b1 Eqv b2 = "; b1 Eqv b2
Print "b1 Imp b2 = "; b1 Imp b2
Print "Not b1 = "; Not b1
Print "b1 AndAlso b2 = "; b1 AndAlso b2
Print "b1 OrElse b2 = "; b1 OrElse b2
Print
End Sub
 
Dim b1 As Boolean = True
Dim b2 As Boolean = True
logicalDemo b1, b2
b2 = False
logicalDemo b1, b2
b1 = False
logicalDemo b1, b2
b2 = True
logicalDemo b1, b2
Print "Press any key to quit"
Sleep</syntaxhighlight>
 
{{out}}
<pre>
b1 = true
b2 = true
b1 And b2 = true
b1 Or b2 = true
b1 XOr b2 = false
b1 Eqv b2 = true
b1 Imp b2 = true
Not b1 = false
b1 AndAlso b2 = true
b1 OrElse b2 = true
 
b1 = true
b2 = false
b1 And b2 = false
b1 Or b2 = true
b1 XOr b2 = true
b1 Eqv b2 = false
b1 Imp b2 = false
Not b1 = false
b1 AndAlso b2 = false
b1 OrElse b2 = true
 
b1 = false
b2 = false
b1 And b2 = false
b1 Or b2 = false
b1 XOr b2 = false
b1 Eqv b2 = true
b1 Imp b2 = true
Not b1 = true
b1 AndAlso b2 = false
b1 OrElse b2 = false
 
b1 = false
b2 = true
b1 And b2 = false
b1 Or b2 = true
b1 XOr b2 = true
b1 Eqv b2 = false
b1 Imp b2 = true
Not b1 = true
b1 AndAlso b2 = false
b1 OrElse b2 = true
</pre>
 
Line 188 ⟶ 878:
POSIX bc has neither Boolean values nor built-in logical operations.
Thus one has to write them oneself:
<langsyntaxhighlight lang="bc">/* The following three functions assume 0 is false and 1 is true */
 
/* And */
Line 212 ⟶ 902:
"not a: "
n(a)
}</langsyntaxhighlight>
 
{{Works with|GNU bc}}
GNU bc's extensions make this task much easier:
<langsyntaxhighlight lang="bc">define logic_test(a, b) {
print "a and b: ", a && b, "\n"
print "a or b: ", a || b, "\n"
print "not a: ", !a, "\n"
}</langsyntaxhighlight>
 
=={{header|Binary Lambda Calculus}}==
Minimal definitions of the logical operations in lambda calculus are: and = <code>\a\b.a b a</code>, or = <code>\a\b.a a b</code>, not = <code>\b\x\y.b y x</code>. In BLC these are <code>00 00 01 01 110 10 110</code>, or = <code>00 00 01 01 110 110 10</code>, not = <code>00 00 00 01 01 1110 10 110</code> respectively.
 
=={{header|BQN}}==
BQN has four logical operators: AND (`∧`), OR (`∨`), NOT (`¬`), XOR (`≠`). The function <code>L</code> lists each of those results in the same order.
 
<syntaxhighlight lang="bqn"> L←∧∾∨∾¬∾≠
∧∾∨∾¬∾≠
0 L 1
⟨ 0 1 0 1 ⟩</syntaxhighlight>
 
=={{header|Bracmat}}==
Line 229 ⟶ 930:
In the example below, the empty string represents 'true' and <code>~</code> represents 'false'. The binary operators <code>&</code> and <code>|</code>, which normally are used as the glue between expressions such as match operations, function definitions and function calls, are used as the logical operators 'and' and 'or', respectively.
 
<langsyntaxhighlight lang="bracmat">( ( Logic
= x y
. '$arg:(=?x,?y)
Line 255 ⟶ 956:
& out$(Logic$(,~))
& out$(Logic$(~,~))
);</langsyntaxhighlight>
{{out}}
<pre>(x,y)=(,):
Line 278 ⟶ 979:
 
=={{header|Brat}}==
<langsyntaxhighlight lang="brat">logic = { a, b |
p "a and b: #{ a && b }"
p "a or b: #{ a || b }"
p "not a: #{ not a }"
}</langsyntaxhighlight>
 
=={{header|C}}==
 
<langsyntaxhighlight lang="c">void print_logic(int a, int b)
{
printf("a and b is %d\n", a && b);
printf("a or b is %d\n", a || b);
printf("not a is %d\n", !a);
}</langsyntaxhighlight>
 
=={{header|C++}}==
 
<lang cpp>void print_logic(bool a, bool b)
{
std::cout << std::boolalpha; // so that bools are written as "true" and "false"
std::cout << "a and b is " << (a && b) << "\n";
std::cout << "a or b is " << (a || b) << "\n";
std::cout << "not a is " << (!a) << "\n";
}</lang>
 
=={{header|C sharp|C#}}==
<langsyntaxhighlight lang="csharp">using System;
 
namespace LogicalOperations
Line 319 ⟶ 1,010:
}
}
}</langsyntaxhighlight>
 
=={{header|C++}}==
 
<syntaxhighlight lang="cpp">void print_logic(bool a, bool b)
{
std::cout << std::boolalpha; // so that bools are written as "true" and "false"
std::cout << "a and b is " << (a && b) << "\n";
std::cout << "a or b is " << (a || b) << "\n";
std::cout << "not a is " << (!a) << "\n";
}</syntaxhighlight>
 
=={{header|Clipper}}==
<langsyntaxhighlight lang="clipper"> Function Foo( a, b )
// a and b was defined as .F. (false) or .T. (true)
? a .AND. b
Line 329 ⟶ 1,029:
? .NOT. a, .NOT. b
Return Nil
</syntaxhighlight>
</lang>
 
=={{header|Clojure}}==
<langsyntaxhighlight lang="clojure">
(defn logical [a b]
(prn (str "a and b is " (and a b)))
Line 339 ⟶ 1,039:
 
(logical true false)
</syntaxhighlight>
</lang>
 
=={{header|COBOL}}==
Logical operations in COBOL are exactly the same as [[Bitwise operations#COBOL|bitwise operations]].
<langsyntaxhighlight lang="cobol"> IDENTIFICATION DIVISION.
PROGRAM-ID. print-logic.
 
Line 368 ⟶ 1,068:
 
GOBACK
.</langsyntaxhighlight>
 
=={{header|ColdFusion}}==
<langsyntaxhighlight lang="cfm"><cffunction name = "logic" hint = "Performs basic logical operations">
<cfargument name = "a" required = "yes" type = "boolean" />
<cfargument name = "a" required = "yes" type = "boolean" />
Line 379 ⟶ 1,079:
NOT 'A' is #!a#
</cfoutput>
</cffunction></langsyntaxhighlight>
 
=={{header|Common Lisp}}==
 
<langsyntaxhighlight lang="lisp">(defun demo-logic (a b)
(mapcar (lambda (op)
(print "a and b is") (write (and a b))
(printformat t "~a or~a b~a is ~a~%" )a op b (writeeval (orlist op a b))))
(print "not a is" ) (write '(notand aor)))</lang>
 
(loop for a in '(nil t) do
(format t "NOT ~a is ~a~%" a (not a))
(loop for b in '(nil t) do (demo-logic a b) (terpri)))
</syntaxhighlight>
 
{{Out}}
<pre>NOT NIL is T
NIL AND NIL is NIL
NIL OR NIL is NIL
 
NIL AND T is NIL
NIL OR T is T
 
NOT T is NIL
T AND NIL is NIL
T OR NIL is T
 
T AND T is T
T OR T is T</pre>
 
CLISP has <tt>xor</tt>, which can be added to the list of ops in <tt>demo-logic</tt> if using that implementation, but it's not part of the standard.
 
=={{header|D}}==
<langsyntaxhighlight lang="d">import std.stdio;
 
void logic(T, U)(T lhs, U rhs) {
Line 421 ⟶ 1,143:
logic(nullStr, emptyStr);
logic(someC, nullC);
}</langsyntaxhighlight>
{{out}}
<pre>'true' is of type 'bool', 'false' is of type 'bool';
Line 448 ⟶ 1,170:
NOT 'logical_operations.C' is false.</pre>
 
=={{header|DelphiDc}}==
<syntaxhighlight lang="dc">[ 1 q ] sT
<lang Delphi>program LogicalOperations;
 
[ 0=T 0 ] s!
{$APPTYPE CONSOLE}
[ l! x S@ l! x L@ + l! x ] s&
[ l! x S@ l! x L@ * l! x ] s|
 
[ 48 + P ] s.
const
a = True;
b = False;
begin
Write('a = ');
Writeln(a);
Write('b = ');
Writeln(b);
Writeln;
 
[ Sb Sa
Write('a AND b: ');
la l. x [ ] P lb l. x [ ] P
Writeln(a AND b);
la lb l& x l. x [ ] P
 
la Lb l| x l. x [ ] P
Write('a OR b: ');
La l! x l. x
Writeln(a OR b);
A P
 
] sF
Write('NOT a: ');
Writeln(NOT a);
 
Write('a XOR b: ');
Writeln(a XOR b);
end.</lang>
 
[a b a&b a|b !a] P A P
0 0 lF x
0 1 lF x
1 0 lF x
1 1 lF x</syntaxhighlight>
{{out}}
<pre>a = TRUE
a b a&b a|b !a
b = FALSE
0 0 0 0 1
0 1 0 1 1
1 0 0 1 0
1 1 1 1 0
</pre>
 
=={{header|Delphi}}==
a AND b: FALSE
Delphi supports all logical operators shown in [[#Pascal|§ Pascal]].
a OR b: TRUE
Furthermore, the exclusive or operator <tt>xor</tt> is supported:
NOT a: FALSE
<syntaxhighlight lang="delphi"> { exclusive or }
a XOR b: TRUE</pre>
writeLn(A:5, ' xor', B:6, ' yields', A xor B:7);</syntaxhighlight>
 
Beware: In Delphi the operators <tt>and</tt>, <tt>or</tt> and <tt>xor</tt> can also refer to [[Bitwise operations#Delphi|bitwise operations]].
=={{header|Déjà Vu}}==
<lang dejavu>showbool a b:
!.( a b or a b and a b xor a b not a )
 
for a in [ false true ]:
for b in [ false true ]:
showbool a b</lang>
{{out}}
<pre>true true true true false false
true false true false true false
false true true false true true
false false false false false true</pre>
 
=={{header|DWScript}}==
<langsyntaxhighlight Delphilang="delphi">var a := True;
var b := False;
 
Line 517 ⟶ 1,227:
 
Print('a XOR b: ');
PrintLn(a XOR b);</langsyntaxhighlight>
{{out}}
<pre>a = True
Line 525 ⟶ 1,235:
NOT a: False
a XOR b: True</pre>
 
=={{header|Dyalect}}==
 
<syntaxhighlight lang="dyalect">var a = true
var b = false
print("a and b is \(a && b)")
print("a or b is \(a || b)")
print("Not a is \(!a)")</syntaxhighlight>
 
=={{header|Déjà Vu}}==
<syntaxhighlight lang="dejavu">showbool a b:
!.( a b or a b and a b xor a b not a )
 
for a in [ false true ]:
for b in [ false true ]:
showbool a b</syntaxhighlight>
{{out}}
<pre>true true true true false false
true false true false true false
false true true false true true
false false false false false true</pre>
 
=={{header|E}}==
 
<langsyntaxhighlight lang="e">def logicalOperations(a :boolean, b :boolean) {
return ["and" => a & b,
"or" => a | b,
"not" => !a,
"xor" => a ^ b]
}</langsyntaxhighlight>
 
Each of these is a method on [http://wiki.erights.org/wiki/Boolean boolean objects]; the above is precisely equivalent to:
 
<langsyntaxhighlight lang="e">def logicalOperations(a :boolean, b :boolean) {
return ["and" => a.and(b),
"or" => a.or(b),
"not" => a.not(),
"xor" => a.xor(b)]
}</langsyntaxhighlight>
 
If the <code>:boolean</code> guards were removed, these operations would also work on other types, such as sets (&amp; is union and | is intersection; <code>not</code> is not supported).
 
=={{header|EasyLang}}==
 
<syntaxhighlight lang="text">
proc logic a b . .
if a = 1 and b = 1
r1 = 1
.
if a = 1 or b = 1
r2 = 1
.
if a = 0
r3 = 1
.
print r1 & " " & r2 & " " & r3
.
logic 0 0
logic 0 1
logic 1 0
logic 1 1
</syntaxhighlight>
 
=={{header|ECL}}==
<syntaxhighlight lang="ecl">
<lang ECL>
LogicalOperations(BOOLEAN A,BOOLEAN B) := FUNCTION
ANDit := A AND B;
Line 566 ⟶ 1,318:
LogicalOperations(TRUE,TRUE);
LogicalOperations(1>2,1=1); //Boolean expressions are also valid here
</syntaxhighlight>
</lang>
 
=={{header|Efene}}==
 
<langsyntaxhighlight lang="efene">compare_bool = fn (A, B) {
io.format("~p and ~p = ~p~n", [A, B, A and B])
io.format("~p or ~p = ~p~n", [A, B, A or B])
Line 585 ⟶ 1,337:
compare_bool(false, false)
}
</syntaxhighlight>
</lang>
 
=={{header|Elena}}==
ELENA 4.x:
<syntaxhighlight lang="elena">import extensions;
public program()
{
bool a := true;
bool b := false;
console.printLine("a and b is ", a && b);
console.printLine("a or b is ", a || b);
console.printLine("Not a is ", a.Inverted);
console.printLine("a xor b is ", a ^^ b)
}</syntaxhighlight>
{{out}}
<pre>
a and b is false
a or b is true
Not a is false
a xor b is true
</pre>
 
=={{header|Elixir}}==
Elixir also provides three boolean operators: <code>or</code>, <code>and</code> and <code>not</code>. These operators are strict in the sense that they expect a boolean (<code>true</code> or <code>false</code>) as their first argument:
<langsyntaxhighlight lang="elixir">iex(1)> true and false
false
iex(2)> false or true
true
iex(3)> not false
true</langsyntaxhighlight>
<code>or</code> and <code>and</code> are short-circuit operators. They only execute the right side if the left side is not enough to determine the result:
 
Besides these boolean operators, Elixir also provides <code>||</code>, <code>&amp;&amp;</code> and <code>!</code> which accept arguments of any type. For these operators, all values except <code>false</code> and <code>nil</code> will evaluate to true:
<langsyntaxhighlight lang="elixir">(28)> nil || 23
23
iex(29)> [] || false
Line 611 ⟶ 1,385:
true
iex(34)> ! 3.14
false</langsyntaxhighlight>
As a rule of thumb, use <code>and</code>, <code>or</code> and <code>not</code> when you are expecting booleans. If any of the arguments are non-boolean, use <code>&amp;&amp;</code>, <code>||</code> and <code>!</code>.
 
=={{header|Elm}}==
<syntaxhighlight lang="elm">
--Open cmd and elm-repl and directly functions can be created
 
--Creating Functions
t=True
f=False
opand a b= a && b
opor a b= a || b
opnot a= not a
 
--Using the created Functions
opand t f
opor t f
opnot f
 
--Output will be False, True and True of type Boolean!
--end
</syntaxhighlight>
 
=={{header|EMal}}==
<syntaxhighlight lang="emal">
fun logicOperations = void by logic a, logic b
writeLine("=== input values are " + a + ", " + b + " ===")
writeLine("a and b: " + (a and b))
writeLine(" a or b: " + (a or b))
writeLine(" not a: " + (not a))
end
logicOperations(false, false)
logicOperations(false, true)
logicOperations(true, false)
logicOperations(true, true)
</syntaxhighlight>
{{out}}
<pre>
=== input values are ⊥, ⊥ ===
a and b: ⊥
a or b: ⊥
not a: ⊤
=== input values are ⊥, ⊤ ===
a and b: ⊥
a or b: ⊤
not a: ⊤
=== input values are ⊤, ⊥ ===
a and b: ⊥
a or b: ⊤
not a: ⊥
=== input values are ⊤, ⊤ ===
a and b: ⊤
a or b: ⊤
not a: ⊥
</pre>
 
=={{header|Erlang}}==
<langsyntaxhighlight Erlanglang="erlang">1> true and false.
false
2> false or true.
Line 624 ⟶ 1,451:
true
5> not (true and true).
false</langsyntaxhighlight>
 
=={{header|Euphoria}}==
<langsyntaxhighlight lang="euphoria">procedure print_logic(integer a, integer b)
printf(1,"a and b is %d\n", a and b)
printf(1,"a or b is %d\n", a or b)
printf(1,"a xor b is %d\n", a xor b)
printf(1,"not a is %d\n", not a)
end procedure</langsyntaxhighlight>
 
=={{header|Excel}}==
Line 638 ⟶ 1,465:
If the values are typed in cells A1 and B1, type in the following in cell C1
 
<langsyntaxhighlight lang="excel">
=CONCATENATE($A1, " AND ", $B1, " is ", AND($A1,$B1))
</syntaxhighlight>
</lang>
 
In D1
 
<langsyntaxhighlight lang="excel">
=CONCATENATE($A1, " OR ", $B1, " is ", OR($A1,$B1))
</syntaxhighlight>
</lang>
 
In E1
 
<langsyntaxhighlight lang="excel">
=CONCATENATE(" NOT ", $A1, " is ", NOT($A1))
</syntaxhighlight>
</lang>
 
=={{header|F Sharp|F#}}==
<langsyntaxhighlight lang="fsharp">let printLogic a b =
printfn "a and b is %b" (a && b)
printfn "a or b is %b" (a || b)
printfn "Not a is %b" (not a)
// The not-equals operator has the same effect as XOR on booleans.
printfn "a exclusive-or b is %b" (a <> b)</langsyntaxhighlight>
 
=={{header|Factor}}==
<langsyntaxhighlight lang="factor">: logical-operators ( a b -- )
{
[ "xor is: " write xor . ]
Line 669 ⟶ 1,496:
[ "or is: " write or . ]
[ "not is: " write drop not . ]
} 2cleave ;</langsyntaxhighlight>
 
=={{header|FALSE}}==
FALSE uses zero/non-zero for testing False and True. Comparison operators return -1 for True and 0 for False, which work with bitwise operators for logical operations.
<langsyntaxhighlight lang="false">1 3=~["unequal, "]?
1 1= 1_=["true is -1, "]?
0~["false is 0, "]?
'm$'a>'z@>&["a < m < z"]?</langsyntaxhighlight>
 
=={{header|Fantom}}==
 
<langsyntaxhighlight lang="fantom">
class Main
{
Line 702 ⟶ 1,529:
}
}
</syntaxhighlight>
</lang>
 
=={{header|Forth}}==
Forth can use bitwise operators if the boolean values are well formed: TRUE (-1) and FALSE (0). '''0<>''' converts an ill-formed flag (zero/non-zero) to a well-formed flag (false/true).
<langsyntaxhighlight lang="forth">: .bool ( ? -- ) if ." true" else ." false" then ;
: logic ( a b -- ) 0<> swap 0<> swap
cr ." a = " over .bool ." b = " dup .bool
cr ." a and b = " 2dup and .bool
cr ." a or b = " over or .bool
cr ." not a = " 0= .bool ;</langsyntaxhighlight>
 
=={{header|Fortran}}==
In ANSI FORTRAN 66 or later, use LOGICAL data type:
<langsyntaxhighlight lang="fortran"> SUBROUTINE PRNLOG(A, B)
LOGICAL A, B
PRINT *, 'a and b is ', A .AND. B
Line 733 ⟶ 1,560:
C called "exclusive or"):
PRINT *, 'a not equivalent to b is ', A .NEQV. B
END</langsyntaxhighlight>
 
=={{header|Free Pascal}}==
''See [[#Delphi|Delphi]]''
 
=={{header|Frink}}==
<syntaxhighlight lang="frink">logical[a,b] :=
{
println["$a and $b is " + (a and b)]
println["$a or $b is " + (a or b)]
println["$a xor $b is " + (a xor b)]
println["$a nand $b is " + (a nand b)]
println["$a nor $b is " + (a nor b)]
println["not $a is " + (not a)]
}</syntaxhighlight>
 
=={{header|FunL}}==
<langsyntaxhighlight lang="funl">def logical( a, b ) = println( """
a and b = ${a and b}
a or b = ${a or b}
Line 743 ⟶ 1,584:
""" )
 
for i <- [false, true], j <- [false, true] do logical( i, j )</langsyntaxhighlight>
 
{{out}}
Line 770 ⟶ 1,611:
not a = false
a xor b = false
</pre>
 
=={{header|FutureBasic}}==
<syntaxhighlight lang="futurebasic">window 1, @"Logical Operations", (0,0,480,270)
 
Boolean a, b
 
text ,,,,, 43
 
print @"In FB, the Boolean constants _true or YES = 1, _false or NO = 0"
print fn StringByPaddingToLength( @"", 39, @"-", 0 )
 
print @"a\tb\tand\tor\txor\tnand\tnor"
print fn StringByPaddingToLength( @"", 39, @"-", 0 )
 
a = NO : b = NO : print a, b, a and b, a or b, a xor b, a nand b, a nor b
a = NO : b = YES : print a, b, a and b, a or b, a xor b, a nand b, a nor b
a = YES : b = NO : print a, b, a and b, a or b, a xor b, a nand b, a nor b
a = YES : b = YES : print a, b, a and b, a or b, a xor b, a nand b, a nor b
 
print
 
print "FB also has shorthand operator expressions"
print fn StringByPaddingToLength( @"", 39, @"-", 0 )
print @"a\tb\t&&\t||\t^^\t^&\t^|"
print fn StringByPaddingToLength( @"", 39, @"-", 0 )
 
a = NO : b = NO : print a, b, a && b, a || b, a ^^ b, a ^& b, a ^| b
a = NO : b = YES : print a, b, a && b, a || b, a ^^ b, a ^& b, a ^| b
a = YES : b = NO : print a, b, a && b, a || b, a ^^ b, a ^& b, a ^| b
a = YES : b = YES : print a, b, a && b, a || b, a ^^ b, a ^& b, a ^| b
 
HandleEvents
</syntaxhighlight>
 
<pre>
In FB, the Boolean constants _true or YES = 1, _false or NO = 0
---------------------------------------
a b and or xor nand nor
---------------------------------------
0 0 0 0 0 0 -1
0 1 0 1 1 0 -2
1 0 0 1 1 1 -1
1 1 1 1 0 0 -1
 
FB also has shorthand operator expressions
---------------------------------------
a b && || ^^ ^& ^|
---------------------------------------
0 0 0 0 0 0 -1
0 1 0 1 1 0 -2
1 0 0 1 1 1 -1
1 1 1 1 0 0 -1
</pre>
 
=={{header|GAP}}==
<langsyntaxhighlight lang="gap">Logical := function(a, b)
return [ a or b, a and b, not a ];
end;
Line 787 ⟶ 1,681:
 
Logical(false, false);
# [ false, false, true ]</langsyntaxhighlight>
 
=={{header|gecho}}==
<syntaxhighlight lang ="gecho">3 4 and</langsyntaxhighlight>
3&&4
<syntaxhighlight lang ="gecho">1 2 or</langsyntaxhighlight>
1||2
 
=={{header|Genie}}==
<syntaxhighlight lang="genie">[indent=4]
/*
Logical operations in Genie
valac logicals.gs
./logicals true false
*/
 
def logicals(a:bool, b:bool)
print @"$a and $b is $(a and b)"
print @"$a or $b is $(a or b)"
print @"not $a is $(not a)"
 
init
a:bool = bool.parse(args[1])
b:bool = bool.parse(args[2])
logicals(a, b)</syntaxhighlight>
 
{{out}}
<pre>prompt$ valac logicals.gs
prompt$ ./logicals true false
true and false is false
true or false is true
not true is false</pre>
 
=={{header|Go}}==
<langsyntaxhighlight lang="go">func printLogic(a, b bool) {
fmt.Println("a and b is", a && b)
fmt.Println("a or b is", a || b)
fmt.Println("not a is", !a)
}</langsyntaxhighlight>
Other operators that work on type bool are == and !=. == corresponds to the logical operation of equivalence. != corresponds to exclusive or.
 
Bitwise operators come into play when you have to work with byte- or bit-level data.
::<syntaxhighlight lang="go">package main
// stackoverflow.com/questions/28432398/difference-between-some-operators-golang
import "fmt"
 
func main() {
// Use bitwise OR | to get the bits that are in 1 OR 2
// 1 = 00000001
// 2 = 00000010
// 1 | 2 = 00000011 = 3
fmt.Println(1 | 2)
 
// Use bitwise OR | to get the bits that are in 1 OR 5
// 1 = 00000001
// 5 = 00000101
// 1 | 5 = 00000101 = 5
fmt.Println(1 | 5)
 
// Use bitwise XOR ^ to get the bits that are in 3 OR 6 BUT NOT BOTH
// 3 = 00000011
// 6 = 00000110
// 3 ^ 6 = 00000101 = 5
fmt.Println(3 ^ 6)
 
// Use bitwise AND & to get the bits that are in 3 AND 6
// 3 = 00000011
// 6 = 00000110
// 3 & 6 = 00000010 = 2
fmt.Println(3 & 6)
 
// Use bit clear AND NOT &^ to get the bits that are in 3 AND NOT 6 (order matters)
// 3 = 00000011
// 6 = 00000110
// 3 &^ 6 = 00000001 = 1
fmt.Println(3 &^ 6)
}</syntaxhighlight>
 
=={{header|Groovy}}==
<langsyntaxhighlight lang="groovy">def logical = { a, b ->
println """
a AND b = ${a} && ${b} = ${a & b}
Line 812 ⟶ 1,768:
a EQV b = ${a} == ${b} = ${a == b}
"""
}</langsyntaxhighlight>
 
Program:
<syntaxhighlight lang="groovy">[true, false].each { a -> [true, false].each { b-> logical(a, b) } }</syntaxhighlight>
<lang groovy>logical(true, true)
logical(true, false)
logical(false, false)
logical(false, true)</lang>
 
{{out}}
Line 833 ⟶ 1,786:
a XOR b = true != false = true
a EQV b = true == false = false
 
 
a AND b = false && false = false
a OR b = false || false = false
NOT a = ! false = true
a XOR b = false != false = false
a EQV b = false == false = true
 
 
Line 846 ⟶ 1,792:
NOT a = ! false = true
a XOR b = false != true = true
a EQV b = false == true = false</pre>
 
 
a AND b = false && false = false
a OR b = false || false = false
NOT a = ! false = true
a XOR b = false != false = false
a EQV b = false == false = true</pre>
 
=={{header|Harbour}}==
<langsyntaxhighlight lang="visualfoxpro">PROCEDURE Foo( a, b )
// a and b was defined as .F. (false) or .T. (true)
? a .AND. b
? a .OR. b
? ! a, ! b
RETURN</langsyntaxhighlight>
 
=={{header|Haskell}}==
Line 860 ⟶ 1,813:
Instead of a function and printing, which is unidiomatic for Haskell, here are the operations in the same style as in [[Bitwise operations]]:
 
<langsyntaxhighlight lang="haskell">a = False
b = True
 
a_and_b = a && b
a_or_b = a || b
not_a = not a</lang>
a_xor_b = a /= b
a_nxor_b = a == b
a_implies_b = a <= b -- sic! </syntaxhighlight>
 
(&&) and (||) are lazy on the second argument and therefore this operations are not symmetric:
<syntaxhighlight lang="haskell">*Main > False && undefined
False
Prelude> undefined && False
*** Exception: Prelude.undefined
Prelude> True || undefined
True
Prelude> undefined || True
*** Exception: Prelude.undefined</syntaxhighlight>
(<=), (<), (>=) and (>) on the other hand are strict:
<syntaxhighlight lang="haskell">Prelude> False <= undefined
*** Exception: Prelude.undefined
Prelude> undefined <= True
*** Exception: Prelude.undefined
Prelude> True < undefined
*** Exception: Prelude.undefined
Prelude> undefined < False
*** Exception: Prelude.undefined</syntaxhighlight>
 
=={{header|hexiscript}}==
<syntaxhighlight lang="hexiscript">fun logic a b
println "a and b = " + (a && b)
println "a or b = " + (a || b)
println " not a = " + (!a)
endfun</syntaxhighlight>
 
=={{header|HicEst}}==
No logical variables. Nonzero is true, zero is false in logical expressions:
<langsyntaxhighlight lang="hicest"> x = value1 /= 0
y = value2 /= 0
NOTx = x == 0
xANDy = x * y
xORy = x + y /= 0
EOR = x /= y </langsyntaxhighlight>
 
=={{header|IoHolyC}}==
 
<lang io>printLogic := method(a,b,
<syntaxhighlight lang="holyc">U0 PrintLogic(Bool a, Bool b) {
writeln("a and b is ", a and b)
writelnPrint("a orand b is %d\n", a or&& b);
writelnPrint("not a or b is %d\n", a not)|| b);
Print("not a is %d\n", !a);
)</lang>
}
 
PrintLogic(TRUE, FALSE);</syntaxhighlight>
 
=={{header|Hy}}==
<syntaxhighlight lang="clojure">(defn logic [a b]
(print "a and b:" (and a b))
(print "a or b:" (or a b))
(print "not a:" (not a)))</syntaxhighlight>
 
=={{header|Icon}} and {{header|Unicon}}==
Line 904 ⟶ 1,895:
 
This implementation uses strings as packed arrays of bits. This facilitates easy reading and writing from external sources. While string length is variable it is controlled and doesn't change under negation. The built-in integer bit operations (ior, ixor, iand, ishift) can be utilized under the covers.
<langsyntaxhighlight Iconlang="icon">invocable all
 
procedure main() #: sample demonstrating boolean function use
Line 930 ⟶ 1,921:
end
 
procedure bnot(b) #: logical complimentcomplement of b (not is a reserved word)
static cs,sc
initial sc := reverse(cs := string(&cset))
Line 965 ⟶ 1,956:
b3 := char(iop(ord(b1[i]|z),ord(b2[i]|z))) || b3
return b3
end</langsyntaxhighlight>
 
{{out|Partial Sample Output:}}
Line 984 ⟶ 1,975:
bxor( "\x02\x00", "\x01" ) = "\x02\x01"
...</pre>
 
=={{Header|Insitux}}==
 
Insitux treats all non-<code>null</code>/<code>false</code> values as truthy, which is illustrated by using placeholder keywords <code>:a</code> and <code>:b</code> in place of just <code>true</code> to see how the different operations process them. <code>and</code> and <code>or</code> can accept more than two arguments but this is not demonstrated here.
 
<syntaxhighlight lang="insitux">
(let pad (comp str (pad-right " " 10)))
 
(print "a b | (and a b) (or a b) (not a) (xor a b)")
(print (str* "-" 20) "+" (str* "-" 40))
 
(join "\n"
(for a [false :a]
b [false :b]
(... str (pad a) (pad b) "| "
(for op [and or not xor]
(pad (if (= op not) (op a) (op a b)))))))
</syntaxhighlight>
 
{{out}}
 
<pre>
a b | (and a b) (or a b) (not a) (xor a b)
--------------------+----------------------------------------
false false | false null true false
false :b | false :b true :b
:a false | false :a false :a
:a :b | true :a false false
</pre>
 
=={{header|Io}}==
<syntaxhighlight lang="io">printLogic := method(a,b,
writeln("a and b is ", a and b)
writeln("a or b is ", a or b)
writeln("not a is ", a not)
)</syntaxhighlight>
 
=={{header|J}}==
 
J uses 0 for logical false and 1 for logical true.
<langsyntaxhighlight lang="j"> aon=: *.`+.`(-.@[)`:0</langsyntaxhighlight>
Given boolean arguments, <code>*.</code> is logical and, <code>+.</code> is logical or, and <code>-.</code>is logical not.
 
Additional primary logical operators include <code>*:</code> (not-and), <code>+:</code> (not-or), <code>~:</code> (exclusive-or) and <code><:</code> (logical implication).
 
<syntaxhighlight lang="j">
<lang j>
a=: 0 0 1 1 NB. Work on vectors to show all possible
b=: 0 1 0 1 NB. 2-bit combos at once.
Line 999 ⟶ 2,026:
0 0 0 1
0 1 1 1
1 1 0 0</langsyntaxhighlight>
 
An alternate approach, based on a probabilistic interpretation, uses <code>*</code> for logical and, <code>-.</code> for logical negation and derives the others: <code>(*&.-.)</code> for logical or, <code>(-.@*)</code> for not-and, <code>(-.@*&.-.)</code> for not-or, <code>(* *&.-. -.@*&.-.)</code> for exclusive or, and <code>(*&.-. -.)~</code> for logical implication. You get the same results for simple truth values this way, but you also get consistent treatment for values between 0 and 1.
 
That said, J also supports truth valued operations on the binary representations of integers. (This is the concept of "packed binary", roughly speaking). For example <code>2b10001&nbsp;b.</code> is '''and''', <code>2b10111&nbsp;b.</code> is '''or''', <code>2b11110&nbsp;b.</code> is '''nand''', etc. (the last four bits of the control argument to <code>b.</code> represent the desired binary truth table, while the prefix of that control argument in these examples specifies "packed binary"). Thus:
 
<syntaxhighlight lang="j"> (2b10001 b. table/~i.4);(2b10110 b. table/~i.4);<2b10000 b. table/~i.4
┌───────────────┬───────────────┬───────────────┐
│┌─────┬───────┐│┌─────┬───────┐│┌─────┬───────┐│
││17 b.│0 1 2 3│││22 b.│0 1 2 3│││16 b.│0 1 2 3││
│├─────┼───────┤│├─────┼───────┤│├─────┼───────┤│
││0 │0 0 0 0│││0 │0 1 2 3│││0 │0 0 0 0││
││1 │0 1 0 1│││1 │1 0 3 2│││1 │0 0 0 0││
││2 │0 0 2 2│││2 │2 3 0 1│││2 │0 0 0 0││
││3 │0 1 2 3│││3 │3 2 1 0│││3 │0 0 0 0││
│└─────┴───────┘│└─────┴───────┘│└─────┴───────┘│
└───────────────┴───────────────┴───────────────┘</syntaxhighlight>
 
=={{header|Jakt}}==
<syntaxhighlight lang="jakt">
fn logical_operations(anon a: bool, anon b: bool) {
println("a and b is {}", a and b)
println("a or b is {}", a or b)
println("not a is {}", not a)
}
 
fn main() {
let a = true
let b = false
logical_operations(a, b)
 
// Extra operations
println("a equals b is {}", a == b)
println("a xor b is {}", (a ^ b) == true) // == true ensures bool
}
</syntaxhighlight>
 
=={{header|Java}}==
 
<langsyntaxhighlight lang="java">public static void logic(boolean a, boolean b){
System.out.println("a AND b: " + (a && b));
System.out.println("a OR b: " + (a || b));
System.out.println("NOT a: " + (!a));
}</langsyntaxhighlight>
 
Additionally, ^ is used for XOR and == is used for "equal to" (a.k.a. bidirectional implication).
 
=={{header|JavaScript}}==
<langsyntaxhighlight lang="javascript">function logic(a,b) {
print("a AND b: " + (a && b));
print("a OR b: " + (a || b));
print("NOT a: " + (!a));
}</langsyntaxhighlight>
 
=={{header|jq}}==
Line 1,024 ⟶ 2,084:
 
In addition to the basic logical operators, jq has <tt>any</tt> and <tt>all</tt> filters. Versions of jq since 1.4 also have extended versions of these for working efficiently with streams.
<langsyntaxhighlight lang="jq">def logic(a; b):
"\(a) and \(b) => \(a and b)",
"\(a) or \(b) => \(a or b)",
"\(a) | not => \(a | not)",
"if \(a) then true else false end => \(if a then true else false end)" ;</langsyntaxhighlight>
'''Example''':
<langsyntaxhighlight lang="jq"> (false, null, []) as $a
| (false, null, {}) as $b
| logic( $a; $b )</langsyntaxhighlight>
<div style="overflow:scroll; height:200px;">
<langsyntaxhighlight lang="sh">$ jq -n -r -f logical_operations.jq
false and false => false
false or false => false
Line 1,070 ⟶ 2,130:
[] or {} => true
[] | not => false
if [] then true else false end => true</langsyntaxhighlight></div>
 
=={{header|Julia}}==
<syntaxhighlight lang="julia">using Printf
<lang Julia>
 
function exerciselogic(a::Bool, b::Bool)
st = @sprintf " %5s" a
Line 1,088 ⟶ 2,149:
println(exerciselogic(a, b))
end
</syntaxhighlight>
</lang>
 
{{out}}
Line 1,103 ⟶ 2,164:
 
This solution shows the bitwise operators in action. There are also short-circuiting or and and (<code>||</code>, <code>&&</code>). In addition, there are updating versions of the three binary logical operators, <code>|=</code>, <code>&=</code> and <code>$=</code>.
 
=={{header|Kotlin}}==
Similar style to FreeBASIC entry:
<syntaxhighlight lang="kotlin">
fun logicalDemo(b1: Boolean, b2: Boolean) {
println("b1 = $b1")
println("b2 = $b2")
println("non-short-circuiting operators:")
println("b1 and b2 = ${b1 and b2}")
println("b1 or b2 = ${b1 or b2}")
println("b1 xor b2 = ${b1 xor b2}")
println("not b1 = ${!b1}")
println("short-circuiting operators:")
println("b1 && b2 = ${b1 && b2}")
println("b1 || b2 = ${b1 || b2}")
println()
}
 
fun main() {
logicalDemo(true, true)
logicalDemo(true, false)
logicalDemo(false, true)
logicalDemo(false, false)
}</syntaxhighlight>
 
{{out}}
<pre>
b1 = true
b2 = true
non-short-circuiting operators:
b1 and b2 = true
b1 or b2 = true
b1 xor b2 = false
not b1 = false
short-circuiting operators:
b1 && b2 = true
b1 || b2 = true
 
b1 = true
b2 = false
non-short-circuiting operators:
b1 and b2 = false
b1 or b2 = true
b1 xor b2 = true
not b1 = false
short-circuiting operators:
b1 && b2 = false
b1 || b2 = true
 
b1 = false
b2 = true
non-short-circuiting operators:
b1 and b2 = false
b1 or b2 = true
b1 xor b2 = true
not b1 = true
short-circuiting operators:
b1 && b2 = false
b1 || b2 = true
 
b1 = false
b2 = false
non-short-circuiting operators:
b1 and b2 = false
b1 or b2 = false
b1 xor b2 = false
not b1 = true
short-circuiting operators:
b1 && b2 = false
b1 || b2 = false
</pre>
 
=={{header|Lambdatalk}}==
<syntaxhighlight lang="scheme">
{and true true true false true} -> false
{or true true true false true} -> true
{not true} -> false
</syntaxhighlight>
 
=={{header|langur}}==
The logical operators in langur compare the "truthiness" of the left and right operands and do not require Booleans.
 
The operators and, or, nand, nor, and?, or?, nand?, nor?, xor?, and nxor? are short-circuiting.
 
Operators that end with ? are null propagating or "database" operators, and will return null if either operand is null. They short-circuit differently than normal operators (only if the left operand is null).
 
<syntaxhighlight lang="langur">val .test = fn(.a, .b) {
join("\n", [
"not {{.a}}: {{not .a}}",
"{{.a}} and {{.b}}: {{.a and .b}}",
"{{.a}} nand {{.b}}: {{.a nand .b}}",
"{{.a}} or {{.b}}: {{.a or .b}}",
"{{.a}} nor {{.b}}: {{.a nor .b}}",
"{{.a}} xor {{.b}}: {{.a xor .b}}",
"{{.a}} nxor {{.b}}: {{.a nxor .b}}",
"",
"not? {{.a}}: {{not? .a}}",
"{{.a}} and? {{.b}}: {{.a and? .b}}",
"{{.a}} nand? {{.b}}: {{.a nand? .b}}",
"{{.a}} or? {{.b}}: {{.a or? .b}}",
"{{.a}} nor? {{.b}}: {{.a nor? .b}}",
"{{.a}} xor? {{.b}}: {{.a xor? .b}}",
"{{.a}} nxor? {{.b}}: {{.a nxor? .b}}",
"\n",
])
}
 
val .tests = [
[true, false],
[false, true],
[true, true],
[false, false],
 
# including null...
[true, null],
[null, true],
[false, null],
[null, false],
[null, null],
]
 
for .t in .tests {
write .test(.t[1], .t[2])
}</syntaxhighlight>
 
{{out}}
<pre>not true: false
true and false: false
true or false: true
true nand false: true
true nor false: false
true xor false: true
true nxor false: false
 
not? true: false
true and? false: false
true or? false: true
true nand? false: true
true nor? false: false
true xor? false: true
true nxor? false: false
 
not false: true
false and true: false
false or true: true
false nand true: true
false nor true: false
false xor true: true
false nxor true: false
 
not? false: true
false and? true: false
false or? true: true
false nand? true: true
false nor? true: false
false xor? true: true
false nxor? true: false
 
not true: false
true and true: true
true or true: true
true nand true: false
true nor true: false
true xor true: false
true nxor true: true
 
not? true: false
true and? true: true
true or? true: true
true nand? true: false
true nor? true: false
true xor? true: false
true nxor? true: true
 
not false: true
false and false: false
false or false: false
false nand false: true
false nor false: true
false xor false: false
false nxor false: true
 
not? false: true
false and? false: false
false or? false: false
false nand? false: true
false nor? false: true
false xor? false: false
false nxor? false: true
 
not true: false
true and null: false
true or null: true
true nand null: true
true nor null: false
true xor null: true
true nxor null: false
 
not? true: false
true and? null: null
true or? null: null
true nand? null: null
true nor? null: null
true xor? null: null
true nxor? null: null
 
not null: true
null and true: false
null or true: true
null nand true: true
null nor true: false
null xor true: true
null nxor true: false
 
not? null: null
null and? true: null
null or? true: null
null nand? true: null
null nor? true: null
null xor? true: null
null nxor? true: null
 
not false: true
false and null: false
false or null: false
false nand null: true
false nor null: true
false xor null: false
false nxor null: true
 
not? false: true
false and? null: null
false or? null: null
false nand? null: null
false nor? null: null
false xor? null: null
false nxor? null: null
 
not null: true
null and false: false
null or false: false
null nand false: true
null nor false: true
null xor false: false
null nxor false: true
 
not? null: null
null and? false: null
null or? false: null
null nand? false: null
null nor? false: null
null xor? false: null
null nxor? false: null
 
not null: true
null and null: false
null or null: false
null nand null: true
null nor null: true
null xor null: false
null nxor null: true
 
not? null: null
null and? null: null
null or? null: null
null nand? null: null
null nor? null: null
null xor? null: null
null nxor? null: null
</pre>
 
=={{header|Lasso}}==
<langsyntaxhighlight Lassolang="lasso">// br is just for formatting output here
define br => '\r'
 
Line 1,119 ⟶ 2,451:
'NOT a: ' + !#a
br
'NOT a (using not): ' + not #a</langsyntaxhighlight>
 
=={{header|Liberty BASIC}}==
Line 1,125 ⟶ 2,457:
0 = false, nonzero = true.
A true value is ANY value not zero, but is usually considered to be either "1" or "-1".
<syntaxhighlight lang="lb">
<lang lb>
False =0
True =not( False)
Line 1,139 ⟶ 2,471:
 
end
</syntaxhighlight>
</lang>
True =-1 False =0 NB True here shown as -1
.
Line 1,147 ⟶ 2,479:
1 0 0 1 1
1 1 1 1 0
 
=={{header|LIL}}==
<syntaxhighlight lang="tcl"># Logical operations, in LIL
set first [expr 1 == 1]
set second [expr 1 == 0]
 
func and-or-not {a b} {
print a $a b $b
print "a AND b" [expr $a && $b]
print "a OR b " [expr $a || $b]
print "NOT a " [expr !$a]
}
 
and-or-not $first $second</syntaxhighlight>
 
{{out}}
<pre>prompt$ lil logicalOperations.lil
a 1 b 0
a AND b 0
a OR b 1
NOT a 0</pre>
 
=={{header|LiveCode}}==
<langsyntaxhighlight LiveCodelang="livecode">function boolOps p1, p2
local boolOpsResult
put p1 && "AND" && p2 && "=" && merge("[[p1 and p2]]") & cr after boolOpsResult
Line 1,155 ⟶ 2,508:
put "NOT" && p1 && "=" && merge("[[not p1]]") & cr after boolOpsResult
return boolOpsResult
end boolOps</langsyntaxhighlight>
Example
<langsyntaxhighlight LiveCodelang="livecode">repeat for each item bop in "true,false"
put boolops(bop, bop) & cr after bopResult
put boolops(bop, not bop) & cr after bopResult
Line 1,178 ⟶ 2,531:
false AND true = false
false OR true = true
NOT false = true</langsyntaxhighlight>
 
=={{header|LLVM}}==
<syntaxhighlight lang="llvm">; This is not strictly LLVM, as it uses the C library function "printf".
; LLVM does not provide a way to print values, so the alternative would be
; to just load the string into memory, and that would be boring.
 
; Additional comments have been inserted, as well as changes made from the output produced by clang such as putting more meaningful labels for the jumps
 
;--- The declarations for the external C functions
declare i32 @printf(i8*, ...)
 
$"FORMAT_AND" = comdat any
 
$"FORMAT_OR" = comdat any
 
$"FORMAT_NOT" = comdat any
 
@"FORMAT_AND" = linkonce_odr unnamed_addr constant [15 x i8] c"a and b is %d\0A\00", comdat, align 1
@"FORMAT_OR" = linkonce_odr unnamed_addr constant [14 x i8] c"a or b is %d\0A\00", comdat, align 1
@"FORMAT_NOT" = linkonce_odr unnamed_addr constant [13 x i8] c"not a is %d\0A\00", comdat, align 1
 
; Function Attrs: noinline nounwind optnone uwtable
define void @print_logic(i32, i32) #0 {
%3 = alloca i32, align 4 ;-- allocate b
%4 = alloca i32, align 4 ;-- allocate a
store i32 %1, i32* %3, align 4 ;-- copy parameter b
store i32 %0, i32* %4, align 4 ;-- copy parameter a
%5 = load i32, i32* %4, align 4 ;-- load a
%6 = icmp ne i32 %5, 0 ;-- is a true?
br i1 %6, label %and_true, label %and_false
 
and_true:
%7 = load i32, i32* %3, align 4
%8 = icmp ne i32 %7, 0
br label %and_false
 
and_false:
%9 = phi i1 [ false, %2 ], [ %8, %and_true ]
%10 = zext i1 %9 to i32
%11 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @"FORMAT_AND", i32 0, i32 0), i32 %10)
%12 = load i32, i32* %4, align 4 ;-- load a
%13 = icmp ne i32 %12, 0 ;-- is a true?
br i1 %13, label %or_true, label %or_false
 
or_false:
%14 = load i32, i32* %3, align 4 ;-- load b
%15 = icmp ne i32 %14, 0 ;-- is b true?
br label %or_true
 
or_true:
%16 = phi i1 [ true, %and_false ], [ %15, %or_false ]
%17 = zext i1 %16 to i32
%18 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @"FORMAT_OR", i32 0, i32 0), i32 %17)
 
%19 = load i32, i32* %4, align 4 ;-- load a
%20 = icmp ne i32 %19, 0
%21 = xor i1 %20, true
%22 = zext i1 %21 to i32
%23 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @"FORMAT_NOT", i32 0, i32 0), i32 %22)
ret void
}
 
; Function Attrs: noinline nounwind optnone uwtable
define i32 @main() #0 {
%1 = alloca i32, align 4 ;-- allocate i
%2 = alloca i32, align 4 ;-- allocate j
store i32 0, i32* %1, align 4 ;-- store 0 in i
br label %loop_i
 
loop_i:
%3 = load i32, i32* %1, align 4 ;-- load i
%4 = icmp slt i32 %3, 2 ;-- i < 2
br i1 %4, label %loop_j_init, label %exit
 
loop_j_init:
store i32 0, i32* %2, align 4 ;-- store 0 in j
br label %loop_j
 
loop_j:
%5 = load i32, i32* %2, align 4 ;-- load j
%6 = icmp slt i32 %5, 2 ;-- j < 2
br i1 %6, label %loop_body, label %loop_i_inc
 
loop_body:
%7 = load i32, i32* %2, align 4 ;-- load j
%8 = load i32, i32* %1, align 4 ;-- load i
call void @print_logic(i32 %8, i32 %7)
%9 = load i32, i32* %2, align 4 ;-- load j
%10 = add nsw i32 %9, 1 ;-- increment j
store i32 %10, i32* %2, align 4 ;-- store j
br label %loop_j
 
loop_i_inc:
%11 = load i32, i32* %1, align 4 ;-- load i
%12 = add nsw i32 %11, 1 ;-- increment i
store i32 %12, i32* %1, align 4 ;-- store i
br label %loop_i
 
exit:
ret i32 0
}
 
attributes #0 = { noinline nounwind optnone uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }</syntaxhighlight>
{{out}}
<pre>a and b is 0
a or b is 0
not a is 1
a and b is 0
a or b is 1
not a is 1
a and b is 0
a or b is 1
not a is 0
a and b is 1
a or b is 1
not a is 0</pre>
 
=={{header|Logo}}==
The boolean literals are used as words ("true and "false) when used in a program.
<langsyntaxhighlight lang="logo">to logic :a :b
(print [a AND b =] and :a :b)
(print [a OR b =] or :a :b)
(print [NOT a =] not :a)
end</langsyntaxhighlight>
 
AND and OR may have arity greater than two if used in parentheses (and :a :b :c).
 
=={{header|Lua}}==
<langsyntaxhighlight lang="lua">
function logic(a,b)
return a and b, a or b, not a
end
</syntaxhighlight>
</lang>
 
=={{header|M2000 Interpreter}}==
<syntaxhighlight lang="m2000 interpreter">
Module CheckIt {
Def Boolean A, B
Document Rep$
A=True
B=False
k=(A, B)
And=Lambda (a as Boolean, b as Boolean)-> a and b
Or=Lambda (a as Boolean, b as Boolean)-> a or b
Xor=Lambda (a as Boolean, b as Boolean)-> a xor b
Not=Lambda (a)->Not a
func=((And, "And"), (Or, "Or"), (Xor, "Xor"))
F1=Each(func)
While F1 {
M1=Each(k)
M2=Each(k)
While M1 {
While M2 {
A=Array(Array(F1), 0)
Rep$=Format$("{0} {1} {2} = {3}",Array(M1), Array$(Array(F1), 1),Array(M2), A(Array(M1), Array(M2)))+{
}
}
}
}
M1=Each(k)
While M1 {
Rep$=Format$("Not {0} = {1}",Array(M1), Not Array(M1))+{
}
}
Report Rep$
Clipboard Rep$
}
CheckIt
</syntaxhighlight>
{{out}}
<pre>
True And True = True
True And False = False
False And True = False
False And False = False
True Or True = True
True Or False = True
False Or True = True
False Or False = False
True Xor True = False
True Xor False = True
False Xor True = True
False Xor False = False
Not True = False
Not False = True
</pre>
 
=={{header|M4}}==
<langsyntaxhighlight lang="m4">define(`logical',
`and($1,$2)=eval($1&&$2) or($1,$2)=eval($1||$2) not($1)=eval(!$1)')
logical(1,0)</langsyntaxhighlight>
 
{{out}}
Line 1,209 ⟶ 2,731:
=={{header|Maple}}==
Infix and prefix operators are provided for each of <code>and</code>, <code>or</code>, <code>not</code> as well as <code>xor</code> and <code>implies</code>.
<syntaxhighlight lang="maple">
<lang Maple>
f:=proc(a,b) a and b, a or b, not a; end proc:
 
Line 1,216 ⟶ 2,738:
f(false,true);
f(false,false);
</syntaxhighlight>
</lang>
{{out}}
<pre> true, true, false
Line 1,223 ⟶ 2,745:
false, false, true</pre>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<langsyntaxhighlight Mathematicalang="mathematica">And[a,b,...]
Or[a,b,...]
Not[a]</langsyntaxhighlight>
And can also be given using the infix operator &&, Or can also be used using the infix operator ||. Not[a] can also be written as !a.
Furthermore Mathematica supports:
<langsyntaxhighlight Mathematicalang="mathematica">Xor[a, b,...]
Nand[a, b,...]
Nor[a, b,...]
Xnor[a, b,...]</langsyntaxhighlight>
Note that the functions are not restricted to 2 arguments; any number of arguments are allowed (except for the function Not).
All these functions can also be used with infix operators, the characters for that are: \[Xor], \[Nand], \[Nor], and \[Xnor]. Or by typing [escape] [name boolean operator] [escape].
 
=={{header|Maxima}}==
<langsyntaxhighlight lang="maxima">f(a, b) := [not a, a or b, a and b];
 
/* to use multiple arguments, use any of these */
Line 1,245 ⟶ 2,767:
"or"(a, b, c, d);
apply("and", [a, b, c, d]);
apply("or", [a, b, c, d]);</langsyntaxhighlight>
 
=={{header|MAXScript}}==
<langsyntaxhighlight lang="maxscript">fn printLogic a b =
(
format "a and b is %\n" (a and b)
format "a or b is %\n" (a or b)
format "not a is %\n" (not a)
)</langsyntaxhighlight>
 
=={{header|Metafont}}==
 
<langsyntaxhighlight lang="metafont">def tf(expr a) = if a: "true" else: "false" fi enddef;
def test(expr a, b) =
for o = "and", "or":
Line 1,264 ⟶ 2,786:
endfor
message "not " & tf(a);
show not a enddef;</langsyntaxhighlight>
 
<langsyntaxhighlight lang="metafont">test(true, true);
test(false, false);
test(true, false);
test(false, true);
end</langsyntaxhighlight>
 
=={{header|min}}==
{{works with|min|0.19.3}}
<syntaxhighlight lang="min">(
:b :a
"xor is: " print! a b xor puts!
"and is: " print! a b and puts!
"or is: " print! a b or puts!
"not is: " print! a not puts!
) :logical-operators</syntaxhighlight>
 
=={{header|Modula-2}}==
<syntaxhighlight lang="modula2">MODULE LogicalOps;
FROM FormatString IMPORT FormatString;
FROM Terminal IMPORT WriteString,WriteLn,ReadChar;
 
PROCEDURE Print(a,b : BOOLEAN);
VAR buf : ARRAY[0..31] OF CHAR;
BEGIN
FormatString("a and b is %b\n", buf, a AND b);
WriteString(buf);
FormatString("a or b is %b\n", buf, a OR b);
WriteString(buf);
FormatString("not a is %b\n", buf, NOT a);
WriteString(buf);
WriteLn
END Print;
 
BEGIN
Print(FALSE, FALSE);
Print(FALSE, TRUE);
Print(TRUE, TRUE);
Print(TRUE, FALSE);
 
ReadChar
END LogicalOps.</syntaxhighlight>
 
=={{header|Modula-3}}==
<langsyntaxhighlight lang="modula3">MODULE Logical EXPORTS Main;
 
FROM IO IMPORT Put;
Line 1,287 ⟶ 2,845:
BEGIN
Test(TRUE, FALSE);
END Logical.</langsyntaxhighlight>
 
=={{header|MUMPS}}==
<syntaxhighlight lang="mumps">
<lang MUMPS>
LOGIC(A,B)
WRITE !,A," AND ",B," IS ",A&B
Line 1,296 ⟶ 2,854:
WRITE !,"NOT ",A," AND ",B," IS ",'(A)&B
WRITE !,"NOT ",A," OR ",B," IS ",'(A)!B
</syntaxhighlight>
</lang>
 
=={{header|Nanoquery}}==
{{trans|Python}}
<syntaxhighlight lang="nanoquery">def logic(a, b)
println "a and b: " + (a && b)
println "a or b: " + (a && b)
println "not a: " + !a
end</syntaxhighlight>
While this is translated from Python, Nanoquery does not allow any object to be treated as a boolean value. As a result, this function must be called with explicit boolean values.
{{out}}
<pre>% import "logic.nq"
% logic($true, $true)
a and b: true
a or b: true
not a: false
% logic($true, $false)
a and b: false
a or b: true
not a: false</pre>
 
=={{header|Neko}}==
<syntaxhighlight lang="actionscript">/**
Logical operations, in Neko
*/
 
/* For logical operations, values need to be explicitly treated as boolean */
/* Only null, false and 0 evaluate as false with $istrue() */
 
var logical = 1
if logical $print("literal 1 tests true\n") else $print("literal 1 tests false\n")
if $istrue(logical) $print("$istrue(1) tests true\n")
 
/* supports && logical AND, || logical OR, $not(value) the opposite of $istrue() */
 
if $istrue(logical) && logical > 0 $print("true path for logical AND\n")
if $istrue(logical) || logical > 1 $print("true path for logical OR\n")
if $not(logical) $print("true path for $not(1)\n") else $print("false path for $not(1)\n")</syntaxhighlight>
 
{{out}}
<pre>prompt$ nekoc logical-operations.neko
prompt$ neko logical-operations.n
literal 1 tests false
$istrue(1) tests true
true path for logical AND
true path for logical OR
false path for $not(1)</pre>
 
=={{header|Nemerle}}==
<langsyntaxhighlight Nemerlelang="nemerle">using System;
using System.Console;
 
Line 1,312 ⟶ 2,916:
Main() : void {WriteLogical(true, false)}
}</langsyntaxhighlight>
Or, if you prefer keywords to operators import the Nemerle.English namespace to use '''and''', '''or''', and '''not'''.
 
=={{header|NetRexx}}==
<langsyntaxhighlight NetRexxlang="netrexx">/* NetRexx */
options replace format comments java crossref symbols binary
 
Line 1,353 ⟶ 2,957:
end lx
return
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 1,378 ⟶ 2,982:
 
=={{header|NewLISP}}==
<langsyntaxhighlight lang="newlisp">
(define (logic a b)
(print "a and b is: " (and a b) "\n a or b is: " (or a b))
(print "\n not a is: " (not a)))
 
</syntaxhighlight>
</lang>
 
=={{header|Nim}}==
<langsyntaxhighlight lang="nim">proc logic(a, b: bool) =
echo "a and b: ", a and b
echo "a or b: ", a or b
echo "not a: ", not a
echo "a xor b: ", a xor b</langsyntaxhighlight>
 
=={{header|Nu}}==
<syntaxhighlight lang="nu">
def ops [a b] {{A: $a, B: $b, "Not A": (not $a), OR: ($a or $b), AND: ($a and $b), XOR: ($a xor $b)}}
 
[true false] | each {[[true $in] [false $in]]} | flatten | each {ops $in.0 $in.1}
</syntaxhighlight>
{{out}}
<pre>
╭───┬───────┬───────┬───────┬───────┬───────┬───────╮
│ # │ A │ B │ Not A │ OR │ AND │ XOR │
├───┼───────┼───────┼───────┼───────┼───────┼───────┤
│ 0 │ true │ true │ false │ true │ true │ false │
│ 1 │ false │ true │ true │ true │ false │ true │
│ 2 │ true │ false │ false │ true │ false │ true │
│ 3 │ false │ false │ true │ false │ false │ false │
╰───┴───────┴───────┴───────┴───────┴───────┴───────╯
</pre>
 
=={{header|Objeck}}==
<langsyntaxhighlight lang="objeck">
bundle Default {
class Logic {
Line 1,405 ⟶ 3,027:
}
}
</syntaxhighlight>
</lang>
 
=={{header|OCaml}}==
 
<langsyntaxhighlight lang="ocaml">let print_logic a b =
Printf.printf "a and b is %B\n" (a && b);
Printf.printf "a or b is %B\n" (a || b);
Printf.printf "not a is %B\n" (not a)</langsyntaxhighlight>
 
=={{header|Octave}}==
 
<langsyntaxhighlight lang="octave">function test(a, b)
s1 = num2str(a);
s2 = num2str(b);
Line 1,428 ⟶ 3,050:
test(false, false);
test(true, false);
test(false, true);</langsyntaxhighlight>
 
=={{header|Oforth}}==
 
<langsyntaxhighlight Oforthlang="oforth">func: logical(b1, b2)
{
System.Out "and = " << b1 b2 and << cr
System.Out "or = " << b1 b2 or << cr
System.Out "xor = " << b1 b2 xor << cr
System.Out "not = " << b1 not << cr ;</syntaxhighlight>
}</lang>
 
=={{header|OOC}}==
Bools in ooc are just covers for C's bools and respond to the same operators.
<langsyntaxhighlight lang="ooc">
logic: func (a: Bool, b: Bool) {
println()
Line 1,457 ⟶ 3,077:
logic(false, true)
}
</syntaxhighlight>
</lang>
 
=={{header|OpenEdge/Progress}}==
The logical data type can have three values: true, false or unknown (represented by question mark).
 
<langsyntaxhighlight lang="progress">FUNCTION testLogical RETURNS CHAR (
i_l1 AS LOGICAL,
i_l2 AS LOGICAL
Line 1,473 ⟶ 3,093:
.
 
END FUNCTION.</langsyntaxhighlight>
<langsyntaxhighlight lang="progress">MESSAGE
testLogical( FALSE, FALSE ) SKIP(1)
testLogical( FALSE, TRUE ) SKIP(1)
Line 1,483 ⟶ 3,103:
testLogical( ?, FALSE ) SKIP(1)
testLogical( ?, TRUE ) SKIP(1)
VIEW-AS ALERT-BOX.</langsyntaxhighlight>
 
{{out}}
Line 1,523 ⟶ 3,143:
 
=={{header|Oz}}==
<langsyntaxhighlight lang="oz">proc {PrintLogic A B}
%% using not short-circuiting standard library functions
{Show {And A B}}
Line 1,532 ⟶ 3,152:
{Show A andthen B}
{Show A orelse B}
end</langsyntaxhighlight>
 
=={{header|PARI/GP}}==
Note that the forms <code>bitand()</code>, <code>bitor()</code>, <code>bitneg()</code>, and <code>bitxor()</code> also exist. These apply the operator to each bit and do not short-circuit, unlike the below.
<langsyntaxhighlight lang="parigp">logic(a,b)={
print(a&b); \\ && is the same
print(a|b); \\ || is the same
print(!a);
};</langsyntaxhighlight>
 
=={{header|Pascal}}==
Nine logical operators are standard.
<lang pascal>procedure printlogic(a, b: boolean);
Since [[Boolean values#Pascal|<tt>Boolean</tt> is a built-in enumeration data type]], all relational operators except the membership operator (<tt>in</tt>) are applicable.
begin
Moreover, [[#Delphi|Delphi]] and [[#Free Pascal|Free Pascal]] support the exclusive operator <tt>xor</tt>.
writeln('a and b is ', a and b);
<syntaxhighlight lang="pascal">function logicalOperations(A, B: Boolean): Boolean;
writeln('a or b is ', a or b);
begin
writeln('not a is', not a);
{ logical conjunction }
end;</lang>
writeLn(A:5, ' and', B:6, ' yields', A and B:7);
{ logical disjunction }
writeLn(A:5, ' or', B:6, ' yields', A or B:7);
{ logical negation }
writeLn(' not', A:6, ' yields', not A:7);
{ logical equivalence }
writeLn(A:5, ' =', B:6, ' yields', A = B:7);
{ negation of logical equivalence }
writeLn(A:5, ' <>', B:6, ' yields', A <> B:7);
{ relational operators }
writeLn(A:5, ' <', B:6, ' yields', A < B:7);
writeLn(A:5, ' >', B:6, ' yields', A > B:7);
writeLn(A:5, ' <=', B:6, ' yields', A <= B:7);
writeLn(A:5, ' >=', B:6, ' yields', A >= B:7);
{ fulfill task requirement of writing a function: }
logicalOperations := true
end;</syntaxhighlight>
Furthermore, [[Extended Pascal]] (ISO standard 10206) defines two additional logical operators.
The operators <tt>and_then</tt> and <tt>or_else</tt> are intended for [[Short-circuit evaluation#Pascal|short-circuit evaluation]].
However, since all actual parameters need to be evaluated ''prior'' activation of the function, it makes little sense to use/show them in the above sample code.
 
=={{header|Perl}}==
 
<langsyntaxhighlight lang="perl">sub show_bool
{
return shift() ? 'true' : 'false', "\n";
Line 1,564 ⟶ 3,204:
print "not a is ", show_bool !$a;
print "a xor b is ", show_bool($a xor $b);
}</langsyntaxhighlight>
 
There are also <code>and</code>, <code>or</code>, and <code>not</code> operators. These are just like <code>&&</code>, <code>||</code>, and <code>!</code> (respectively) except for their precedences, which are much lower.
 
=={{header|Perl 6}}==
 
Perl 6 has an abundance of logical operators for various purposes.
<lang perl6>sub logic($a,$b) {
say "$a && $b is ", $a && $b; # short-circuiting
say "$a || $b is ", $a || $b; # short-circuiting
say "$a ^^ $b is ", $a ^^ $b;
say "!$a is ", !$a;
 
say "$a ?& $b is ", $a ?& $b; # non-short-circuiting
say "$a ?| $b is ", $a ?| $b; # non-short-circuiting
say "$a ?^ $b is ", $a ?^ $b; # non-short-circuiting
 
say "$a +& $b is ", $a +& $b; # numeric bitwise
say "$a +| $b is ", $a +| $b; # numeric bitwise
say "$a +^ $b is ", $a +^ $b; # numeric bitwise
 
say "$a ~& $b is ", $a ~& $b; # buffer bitwise
say "$a ~| $b is ", $a ~| $b; # buffer bitwise
say "$a ~^ $b is ", $a ~| $b; # buffer bitwise
 
say "$a & $b is ", $a & $b; # junctional/autothreading
say "$a | $b is ", $a | $b; # junctional/autothreading
say "$a ^ $b is ", $a ^ $b; # junctional/autothreading
 
say "$a and $b is ", ($a and $b); # loose short-circuiting
say "$a or $b is ", ($a or $b); # loose short-circuiting
say "$a xor $b is ", ($a xor $b);
say "not $a is ", (not $a);
}
 
logic(3,10);</lang>
{{out}}
<pre>3 && 10 is 10
3 || 10 is 3
3 ^^ 10 is Nil
!3 is False
3 ?& 10 is True
3 ?| 10 is True
3 ?^ 10 is False
3 +& 10 is 2
3 +| 10 is 11
3 +^ 10 is 9
3 ~& 10 is 1
3 ~| 10 is 30
3 ~^ 10 is 30
3 & 10 is all(3, 10)
3 | 10 is any(3, 10)
3 ^ 10 is one(3, 10)
3 and 10 is 10
3 or 10 is 3
3 xor 10 is Nil
not 3 is False</pre>
 
=={{header|Phix}}==
{{libheader|Phix/basics}}
There is no builtin boolean type, but you can either use integers or create one easily enough.<br>
There is a builtin bool type, which is actually just an alias for integer, and a proper boolean type in builtins/ptypes.e<br>
The operators always return 1(true) or 0(false), and treat operands of 0 as false and all other (atom) values as true.<br>
Short-circuiting is always applied (to all "and"/"or" expressions)<br>
Other relational operators and maths are also valid, if you wanna get clever.
<lang Phix>--constant TRUE = (1=1), -- 1 internally \ now pre-
-- FALSE = not TRUE -- 0 internally / defined
type boolean(object b)
return integer(b) and find(b,{TRUE,FALSE})!=0
end type
 
function logicop(boolean a, boolean b)
return {a, b, a and b, a or b, not a, a xor b, a=b, a!=b}
end function
 
<!--<syntaxhighlight lang="phix">-->
function TF(sequence tf)
<span style="color: #008080;">function</span> <span style="color: #000000;">logicop</span><span style="color: #0000FF;">(</span><span style="color: #004080;">bool</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">)</span>
boolean tfi
<span style="color: #008080;">return</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">a</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">a</span> <span style="color: #008080;">and</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">a</span> <span style="color: #008080;">or</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">,</span> <span style="color: #008080;">not</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">a</span> <span style="color: #008080;">xor</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">==</span><span style="color: #000000;">b</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">b</span><span style="color: #0000FF;">}</span>
for i=1 to length(tf) do
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
tfi = tf[i]
tf[i] = iff(tfi?'T','F')
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" a b and or not xor == !=\n"</span><span style="color: #0000FF;">)</span>
end for
<span style="color: #008080;">for</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">=</span><span style="color: #000000;">FALSE</span> <span style="color: #008080;">to</span> <span style="color: #000000;">TRUE</span> <span style="color: #008080;">do</span> <span style="color: #000080;font-style:italic;">-- nb: TRUE to FALSE would need a "by -1".</span>
return tf
<span style="color: #008080;">for</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">=</span><span style="color: #000000;">FALSE</span> <span style="color: #008080;">to</span> <span style="color: #000000;">TRUE</span> <span style="color: #008080;">do</span>
end function
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%-5t %-5t %-5t %-5t %-5t %-5t %-5t %-5t\n"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">logicop</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">,</span><span style="color: #000000;">b</span><span style="color: #0000FF;">))</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<!--</syntaxhighlight>-->
 
printf(1," a b and or not xor = !=\n")
for a=FALSE to TRUE do -- nb: TRUE to FALSE would need a "by -1".
for b=FALSE to TRUE do
printf(1,"%2c %2c %c %c %c %c %c %c\n",TF(logicop(a,b)))
end for
end for</lang>
{{out}}
<pre>
a b and or not xor == !=
Ffalse Ffalse Ffalse Ffalse Ttrue F false T Ftrue false
Ffalse Ttrue F false T true T true T F Ttrue false true
Ttrue F false F false T true F false T Ftrue T false true
Ttrue T true T Ttrue Ftrue F false T F false true false
</pre>
Simpler version using plain integer flags:
<lang Phix>function logiicop(integer a, integer b)
return {a, b, a and b, a or b, not a, a xor b, a=b, a!=b}
end function
 
<!--<syntaxhighlight lang="phix">-->
printf(1," a b and or not xor = !=\n")
<span style="color: #008080;">function</span> <span style="color: #000000;">logiicop</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">)</span>
for a=0 to 1 do
<span style="color: #008080;">return</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">a</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">a</span> <span style="color: #008080;">and</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">a</span> <span style="color: #008080;">or</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">,</span> <span style="color: #008080;">not</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">a</span> <span style="color: #008080;">xor</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">=</span><span style="color: #000000;">b</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">b</span><span style="color: #0000FF;">}</span>
for b=0 to 1 do
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
printf(1,"%2d %2d %d %d %d %d %d %d\n",logiicop(a,b))
end for
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" a b and or not xor == !=\n"</span><span style="color: #0000FF;">)</span>
end for</lang>
<span style="color: #008080;">for</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">to</span> <span style="color: #000000;">1</span> <span style="color: #008080;">do</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">to</span> <span style="color: #000000;">1</span> <span style="color: #008080;">do</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" %d %d %d %d %d %d %d %d\n"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">logiicop</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">,</span><span style="color: #000000;">b</span><span style="color: #0000FF;">))</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<!--</syntaxhighlight>-->
 
{{out}}
<pre>
a b and or not xor == !=
0 0 0 0 1 0 1 0
0 1 0 1 1 1 0 1
1 0 0 1 0 1 0 1
1 1 1 1 0 0 1 0
</pre>
 
=={{header|Phixmonti}}==
<syntaxhighlight lang="Phixmonti">/# Rosetta Code problem: https://rosettacode.org/wiki/Logical_operations
by Galileo, 11/2022 #/
 
include ..\Utilitys.pmt
 
def logiicop var b var a
( a b a b and a b or a not a b xor a b == a b != )
enddef
 
def printSec
len for get print "\t" print endfor drop nl
enddef
 
( "a" "b" "and" "or" "not" "xor" "==" "!=" ) printSec
( 0 1 ) for dup
( 0 1 ) for
logiicop printSec
endfor
endfor</syntaxhighlight>
{{out}}
<pre>a b and or not xor == !=
0 0 0 0 1 0 1 0
0 1 0 1 1 1 0 1
1 0 0 1 0 1 0 1
1 1 1 1 0 0 1 0
 
=== Press any key to exit ===</pre>
 
=={{header|PHP}}==
 
<langsyntaxhighlight lang="php">function print_logic($a, $b)
{
echo "a and b is ", $a && $b ? 'True' : 'False', "\n";
echo "a or b is ", $a || $b ? 'True' : 'False', "\n";
echo "not a is ", ! $a ? 'True' : 'False', "\n";
}</langsyntaxhighlight>
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp">(de logic (A B)
(prin "A AND B is ")
(println (and A B))
Line 1,698 ⟶ 3,307:
(println (xor A B))
(prin "NOT A is ")
(println (not A)) )</langsyntaxhighlight>
 
=={{header|PL/I}}==
<langsyntaxhighlight lang="pli">logical_ops: procedure (t, u);
declare (t, u) bit (1);
 
Line 1,708 ⟶ 3,317:
put skip list (^t); /* logical not */
put skip list (t ^ u); /* exclusive or */
end logical_ops;</langsyntaxhighlight>
 
=={{header|Pop11}}==
 
<langsyntaxhighlight lang="pop11">define print_logic(a, b);
printf(a and b, 'a and b is %p\n');
printf(a or b, 'a or b is %p\n');
printf(not(a), 'not a is %p\n');
enddefine;</langsyntaxhighlight>
 
Example usage is:
<syntaxhighlight lang ="pop11">print_logic(true, false);</langsyntaxhighlight>
 
=={{header|PostScript}}==
<langsyntaxhighlight lang="postscript">
/logical{
/a exch def
Line 1,730 ⟶ 3,339:
a not =
}def
</syntaxhighlight>
</lang>
 
=={{header|PowerShell}}==
<langsyntaxhighlight lang="powershell">function Test-Boolean ([bool] $a, [bool] $b) {
Write-Host "A and B: " ($a -and $b)
Write-Host "A or B: " ($a -or $b)
Line 1,739 ⟶ 3,348:
Write-Host "not A: " (!$a)
Write-Host "A xor B: " ($a -xor $b)
}</langsyntaxhighlight>
 
=={{header|Prolog}}==
Line 1,776 ⟶ 3,385:
=={{header|PureBasic}}==
 
<langsyntaxhighlight PureBasiclang="purebasic">Procedure LogicDebug(a,b)
Debug a And& b ;And
Debug a Or| b ;Or
Debug Not ~a ;Not
Debug a XOr! b ;XOr
EndProcedure</lang>
 
logicDebug(#True, #True)
logicDebug(#True, #False)
logicDebug(#False, #False)</syntaxhighlight>
 
=={{header|Python}}==
<langsyntaxhighlight lang="python">def logic(a, b):
print ('a and b:', a and b)
print ('a or b:' , a or b)
print ('not a:' , not a)</langsyntaxhighlight>
 
Note: Any normal object can be treated as a Boolean in Python. Numeric objects which evaluate to any non-zero value are "True" otherwise they are false. Non-empty strings, lists, tuples and other sequences are "True" otherwise they are false. The pre-defined ''None'' object is also treated as "False." In Python 2.3 pre-defined objects named ''True'' and ''False'' were added to the language; prior to that it was a common convention to include a line: ''False, True = 0, 1'' to use these as names. Custom classes which implement ''__nonzero__'' or ''__len__'' or some other special methods can be implicitly evaluated as Booleans based on those results.
 
=={{header|QB64}}==
 
<syntaxhighlight lang="qb64">
Dim As _Unsigned _Bit First, Second
First = 0: Second = 1
Print " Operator F S results "
 
Print " AND 1 0 "; First And Second
Print " XOR 1 0 "; First Xor Second
Print " OR 1 0 "; First Or Second
Print " NOT 1 "; Not First
Print " EQV 1 0 "; First Eqv Second
Print " IMP 1 0 "; First Imp Second
 
 
</syntaxhighlight>
 
=={{header|Quackery}}==
 
Quackery also has the boolean words <code>nand</code> and <code>xor</code>.
 
<syntaxhighlight lang="quackery"> [ iff [ say "true" ]
else [ say "false"] ] is echobool ( b --> )
 
[ 2dup and
say "A and B is " echobool cr
over or
say "A or B is " echobool cr
not
say "not A is " echobool cr ] is task ( A B --> )</syntaxhighlight>
 
{{out}}
 
As a dialogue in the Quackery shell.
 
<pre>/O> true true task
...
A and B is true
A or B is true
not A is false
 
Stack empty.
 
/O> true false task
...
A and B is false
A or B is true
not A is false
 
Stack empty.
 
/O> false true task
...
A and B is false
A or B is true
not A is true
 
Stack empty.
 
/O> false false task
...
A and B is false
A or B is false
not A is true
 
Stack empty.</pre>
 
=={{header|R}}==
<langsyntaxhighlight Rlang="r">logic <- function(a, b) {
print(a && b)
print(a || b)
Line 1,800 ⟶ 3,480:
logic(TRUE, TRUE)
logic(TRUE, FALSE)
logic(FALSE, FALSE)</langsyntaxhighlight>
 
=={{header|Racket}}==
<langsyntaxhighlight Racketlang="racket">#lang racket
 
(define (logic a b)
Line 1,812 ⟶ 3,492:
(displayln (format "a nor b equals ~a" (nor a b)))
(displayln (format "a implies b equals ~a" (implies a b)))
(displayln (format "a xor b equals ~a" (xor a b))))</langsyntaxhighlight>
 
=={{header|Raku}}==
(formerly Perl 6)
 
Raku has an abundance of logical operators for various purposes.
<syntaxhighlight lang="raku" line>sub logic($a,$b) {
say "$a && $b is ", $a && $b; # short-circuiting
say "$a || $b is ", $a || $b; # short-circuiting
say "$a ^^ $b is ", $a ^^ $b;
say "!$a is ", !$a;
 
say "$a ?& $b is ", $a ?& $b; # non-short-circuiting
say "$a ?| $b is ", $a ?| $b; # non-short-circuiting
say "$a ?^ $b is ", $a ?^ $b; # non-short-circuiting
 
say "$a +& $b is ", $a +& $b; # numeric bitwise
say "$a +| $b is ", $a +| $b; # numeric bitwise
say "$a +^ $b is ", $a +^ $b; # numeric bitwise
 
say "$a ~& $b is ", $a ~& $b; # buffer bitwise
say "$a ~| $b is ", $a ~| $b; # buffer bitwise
say "$a ~^ $b is ", $a ~| $b; # buffer bitwise
 
say "$a & $b is ", $a & $b; # junctional/autothreading
say "$a | $b is ", $a | $b; # junctional/autothreading
say "$a ^ $b is ", $a ^ $b; # junctional/autothreading
 
say "$a and $b is ", ($a and $b); # loose short-circuiting
say "$a or $b is ", ($a or $b); # loose short-circuiting
say "$a xor $b is ", ($a xor $b);
say "not $a is ", (not $a);
}
 
logic(3,10);</syntaxhighlight>
{{out}}
<pre>3 && 10 is 10
3 || 10 is 3
3 ^^ 10 is Nil
!3 is False
3 ?& 10 is True
3 ?| 10 is True
3 ?^ 10 is False
3 +& 10 is 2
3 +| 10 is 11
3 +^ 10 is 9
3 ~& 10 is 1
3 ~| 10 is 30
3 ~^ 10 is 30
3 & 10 is all(3, 10)
3 | 10 is any(3, 10)
3 ^ 10 is one(3, 10)
3 and 10 is 10
3 or 10 is 3
3 xor 10 is Nil
not 3 is False</pre>
 
=={{header|Rascal}}==
<langsyntaxhighlight lang="rascal">import IO;
 
public void logic(bool a, bool b){
Line 1,823 ⟶ 3,558:
println("a implies b, is <a ==> b>");
println("not a", <!a>");
}</langsyntaxhighlight>
 
{{out}}
Line 1,836 ⟶ 3,571:
 
=={{header|REBOL}}==
<langsyntaxhighlight lang="rebol">logics: func [a [logic!] b [logic!]] [
print ['and tab a and b]
print ['or tab a or b]
Line 1,848 ⟶ 3,583:
print ['any tab any [a b]]
print ['all tab all [a b]]
]</langsyntaxhighlight>
 
Example:
Line 1,862 ⟶ 3,597:
any true
all none
</pre>
 
=={{header|Relation}}==
<syntaxhighlight lang="relation">
program logic(x,y)
relation a, b, op, result
insert x, y, "and", x and y
insert x, y, "or", x or y
insert x, "", "not", not x
insert x, y, "xor", x xor y
print
end program
 
run logic(0,0)
run logic(0,1)
run logic(1,0)
run logic(1,1)
</syntaxhighlight>
In Relation TRUE is the number 1 (or any different from 0) and FALSE 0.
 
=={{header|ReScript}}==
<syntaxhighlight lang="rescript">let logic = (a, b) => {
Js.log(string_of_bool(a) ++ " and " ++ string_of_bool(b) ++ " = " ++ string_of_bool(a && b))
Js.log(string_of_bool(a) ++ " or " ++ string_of_bool(b) ++ " = " ++ string_of_bool(a || b))
}
 
let logic2 = (a) =>
Js.log("not(" ++ string_of_bool(a) ++ ") = " ++ string_of_bool(!a))
 
logic(true, true)
logic(true, false)
logic(false, true)
logic(false, false)
 
logic2(true)
logic2(false)</syntaxhighlight>
{{out}}
<pre>
$ bsc logical_op.res > logical_op.bs.js
$ node logical_op.bs.js
true and true = true
true or true = true
true and false = false
true or false = true
false and true = false
false or true = true
false and false = false
false or false = false
not(true) = false
not(false) = true
</pre>
 
=={{header|Retro}}==
<langsyntaxhighlight Retrolang="retro">: .bool ( f- ) [ "true" ] [ "false" ] if puts cr ;
: logic ( ab- )
"\na = " puts over .bool "b = " puts dup .bool
"\na and b = " puts 2dup and .bool
"\na or b = " puts over or .bool
"\nnot a = " puts not .bool ;</langsyntaxhighlight>
 
=={{header|REXX}}==
The REXX language's boolean values are well formed: 1 <tt> (true)</tt>, and 0 <tt>(false)</tt>.
<br><br>Any other values will raise a REXX '''syntax''' condition (error).
<lang rexx>/*REXX program to show some binary (AKA bit or logical) operations. */
x=1; y=0
/*═════════════════════════════════════════════════echo X,Y values*/
call TT 'name', "value"
call TT 'x' , x
call TT 'y' , y
/*═════════════════════════════════════════════════negate X,Y values*/
call TT 'name', "negated"
call TT 'x' , \x /*some REXXes support the ¬ char.*/
call TT 'y' , \y
/*═════════════════════════════════════════════════AND X,Y values*/
call TT 'value','value',"AND"; do x=0 to 1
do y=0 to 1; call TT x,y, x & y; end
end
/*═════════════════════════════════════════════════OR X,Y values*/
call TT 'value','value',"OR"; do x=0 to 1
do y=0 to 1; call TT x,y, x | y; end
end
/*═════════════════════════════════════════════════XOR X,Y values*/
call TT 'value','value',"XOR"; do x=0 for 2
do y=0 for 2; call TT x,y, x && y; end
end
exit /*stick a fork in it, we're done.*/
/*──────────────────────────────────TT subroutine───────────────────────*/
TT: parse arg a.1,a.2,a.3,a.4; hdr=length(a.1)\==1; if hdr then say; w=7
do TT=0 to hdr; _=
do k=1 for arg(); _=_ center(a.k,w); end /*k*/
say _
a.=copies('─',w)
end /*TT*/
return</lang>
 
:::* &nbsp; '''1''' &nbsp; <tt> (true)</tt>
{{out}}
:::* &nbsp; '''0''' &nbsp; <tt>(false)</tt>
 
 
Any other value will raise a REXX '''syntax''' error condition.
===basic boolean functions===
<syntaxhighlight lang="rexx">/*REXX program demonstrates some binary (also known as bit or logical) operations.*/
x= 1 ; @x= ' x ' /*set the initial values of X and Y, */
y= 0 ; @y= ' y ' /* and a couple of literals for HDRs. */
/* [↓] echo the X and Y values.*/
call $ 'name', "value" /*display the header (title) line. */
call $ 'x' , x /*display "x" and then the value of X.*/
call $ 'y' , y /* " "y" " " " " " Y */
/* [↓] negate the X; then the Y value.*/
call $ 'name', "negated" /*some REXXes support the ¬ character*/
call $ 'x' , \x /*display "x" and then the value of ¬X*/
call $ 'y' , \y /* " "y" " " " " " ¬Y*/
say
say
call $ @x, @y, 'AND'; do x=0 to 1; do y=0 to 1; call $ x, y, x & y; end; end
call $ @x, @y, 'OR' ; do x=0 to 1; do y=0 to 1; call $ x, y, x | y; end; end
call $ @x, @y, 'XOR'; do x=0 to 1; do y=0 to 1; call $ x, y, x && y; end; end
exit 0 /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
$: parse arg @.1, @.2, @.3, @.4; hdr= length(@.1) \== 1; if hdr then say
do j=0 to hdr; _=
do k=1 for arg(); _= _ center(@.k, 7)
end /*k*/
say _
@.= copies('═', 7) /*define a new header separator line. */
end /*j*/
return</syntaxhighlight>
{{out|output|text=&nbsp; when using the default (internal) inputs:}}
<pre>
name value
═══════ ═══════
─────── ───────
x 1
y 0
 
name negated
═══════ ═══════
─────── ───────
x 0
y 1
 
 
value value AND
 
─────── ─────── ───────
x y AND
═══════ ═══════ ═══════
0 0 0
0 1 0
Line 1,926 ⟶ 3,713:
1 1 1
 
value x y value OR
═══════ ═══════ ═══════
─────── ─────── ───────
0 0 0
0 1 1
Line 1,933 ⟶ 3,720:
1 1 1
 
value x y value XOR
═══════ ═══════ ═══════
─────── ─────── ───────
0 0 0
0 1 1
1 0 1
1 1 0
</pre>
 
===extended boolean functions===
All sixteen boolean functions could easily be shown.
<syntaxhighlight lang="rexx">/*REXX pgm demonstrates some binary (also known as bit or logical) extended operations.*/
x= 1 ; @x= ' x ' /*set the initial values of X and Y, */
y= 0 ; @y= ' y ' /* and a couple of literals for HDRs. */
/* [↓] echo the X and Y values.*/
call $ 'name', "value" /*display the header (title) line. */
call $ 'x' , x /*display "x" and then the value of X.*/
call $ 'y' , y /* " "y" " " " " " Y */
/* [↓] negate the X; then the Y value.*/
call $ 'name', "negated" /*some REXXes support the ¬ character*/
call $ 'x' , \x /*display "x" and then the value of ¬X*/
call $ 'y' , \y /* " "y" " " " " " ¬Y*/
say /*note: NXOR is also known as XNOR. */
say /*all 16 boolean operations could ···*/
/* be shown, but only the commonly ···*/
/* known functions will be shown here.*/
call $ @x, @y, 'AND' ; do x=0 to 1; do y=0 to 1; call $ x, y, x & y ; end; end
call $ @x, @y, 'NAND'; do x=0 to 1; do y=0 to 1; call $ x, y, \(x & y); end; end
call $ @x, @y, 'OR' ; do x=0 to 1; do y=0 to 1; call $ x, y, x | y ; end; end
call $ @x, @y, 'NOR' ; do x=0 to 1; do y=0 to 1; call $ x, y, \(x | y); end; end
call $ @x, @y, 'XOR' ; do x=0 to 1; do y=0 to 1; call $ x, y, x && y ; end; end
call $ @x, @y, 'NXOR'; do x=0 to 1; do y=0 to 1; call $ x, y, \(x && y); end; end
exit 0 /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
$: parse arg @.1, @.2, @.3, @.4; hdr= length(@.1) \== 1; if hdr then say
do j=0 to hdr; _=
do k=1 for arg(); _=_ center(@.k, 7)
end /*k*/
say _
@.= copies('═', 7) /*define a new separator (header) line.*/
end /*j*/
return</syntaxhighlight>
{{out|output|text=&nbsp; when using the default (internal) inputs:}}
<pre>
name value
═══════ ═══════
x 1
y 0
 
name negated
═══════ ═══════
x 0
y 1
 
 
 
x y AND
═══════ ═══════ ═══════
0 0 0
0 1 0
1 0 0
1 1 1
 
x y NAND
═══════ ═══════ ═══════
0 0 1
0 1 1
1 0 1
1 1 0
 
x y OR
═══════ ═══════ ═══════
0 0 0
0 1 1
1 0 1
1 1 1
 
x y NOR
═══════ ═══════ ═══════
0 0 1
0 1 0
1 0 0
1 1 0
 
x y XOR
═══════ ═══════ ═══════
0 0 0
0 1 1
1 0 1
1 1 0
 
x y NXOR
═══════ ═══════ ═══════
0 0 1
0 1 0
1 0 0
1 1 1
</pre>
 
=={{header|Ring}}==
<langsyntaxhighlight lang="ring">
x = true
y = false
Line 1,949 ⟶ 3,826:
see "x or y = " + (x or y) + nl
see "not x = " + (not x) + nl
</syntaxhighlight>
</lang>
 
=={{header|RLaB}}==
Line 1,955 ⟶ 3,832:
<code>and/or/not</code> are synonymous with <code>&&/||/!</code>. In the case when the argument is a real number (default type of argument) the default statement in the absence of ''if'' command is ''is the argument non-zero''.
Therefore
<syntaxhighlight lang="rlab">
<lang RLaB>
>> x = 5
5
Line 1,966 ⟶ 3,843:
>> x && y
0
</syntaxhighlight>
</lang>
 
However, if arguments to the functions are of the type ''integer'' then the functions operate bit-wise.
<syntaxhighlight lang="rlab">
<lang RLaB>
>> x = int(5)
5
Line 1,980 ⟶ 3,857:
>> x && y
0
</syntaxhighlight>
</lang>
 
=={{header|Robotic}}==
Due to the lack of booleans, there is no way to perform logical operations in Robotic.
However, [[Bitwise_operations|bitwise operators]] can be used.
 
=={{header|RPL}}==
≪ → a b
≪ "a and b = " a b AND →STR +
"a or b = " a b OR →STR +
"not a = " a NOT →STR +
"a xor b = " a b XOR →STR +
≫ ≫ ''''LOGIC'''' STO
=={{header|Ruby}}==
<langsyntaxhighlight lang="ruby">def logic(a, b)
print 'a and b: ', a && b, "\n"
print 'a or b: ' , a || b, "\n"
print 'not a: ' , !a , "\n"
print 'a xor b: ' , a ^ b, "\n"
end</langsyntaxhighlight>
<code>and/or/not</code> are synonymous with <code>&&/||/!</code> albeit with lower precedence.
 
=={{header|Rust}}==
{{works with|Rust|1.1}}
<syntaxhighlight lang="rust">
<lang Rust>
fn boolean_ops(a: bool, b: bool) {
println!("{} and {} -> {}", a, b, a && b);
Line 2,007 ⟶ 3,895:
boolean_ops(false, false)
}
</syntaxhighlight>
</lang>
The Boolean operators || and && are more efficient versions of | and & in that the right-hand operand is only evaluated when the left-hand operand does not already determine the result of the expression.
 
=={{header|Scala}}==
In vanilla Scala:
<langsyntaxhighlight lang="scala">def logical(a: Boolean, b: Boolean): Unit = {
println("and: " + (a && b))
println("or: " + (a || b))
Line 2,018 ⟶ 3,906:
}
 
logical(true, false)</langsyntaxhighlight>
 
With Scalaz:
<langsyntaxhighlight lang="scala">def logical(a: Boolean, b: Boolean): IO[Unit] = for {
_ <- putStrLn("and: " ++ (a && b).shows)
_ <- putStrLn("or: " ++ (a || b).shows)
Line 2,027 ⟶ 3,915:
} yield ()
 
logical(true, false).unsafePerformIO</langsyntaxhighlight>
 
=={{header|Scheme}}==
<langsyntaxhighlight lang="scheme">(define (logic a b)
(display "a and b is ")
(display (and a b))
Line 2,039 ⟶ 3,927:
(display "not a is ")
(display (not a))
(newline))</langsyntaxhighlight>
 
=={{header|Seed7}}==
<langsyntaxhighlight lang="seed7">const proc: writeLogic (in boolean: a, in boolean: b) is func
begin
writeln("a and b is " <& a and b);
writeln("a or b is " <& a or b);
writeln("not a is " <& not a);
end func;</langsyntaxhighlight>
 
=={{header|Self}}==
 
<langsyntaxhighlight lang="self">true not = false.
( true && false ) = false.
( true ^^ false ) = true. "xor"
( true || false ) = true. "or"
</syntaxhighlight>
</lang>
 
=={{header|Sidef}}==
<langsyntaxhighlight lang="ruby">func logic(a, b) {
say ("a and b: ", a && b);
say ("a or b: ", a || b);
Line 2,065 ⟶ 3,953:
}
 
logic(false, true);</langsyntaxhighlight>
{{out}}
<pre>a and b: false
Line 2,071 ⟶ 3,959:
a xor b: true
not a: true</pre>
 
=={{header|SkookumScript}}==
 
SkookumScript has a <code>Boolean</code> class with two possible values: <code>true</code> or <code>false</code>. Conditionals such as <code>if</code> expect a <code>Boolean</code> type and no other types can be implicitly coerced to a <code>Boolean</code> though they can be explicitly converted. Likewise <code>Boolean</code> cannot be implicitly coerced to an <code>Integer</code> value.
 
This makes a closure that takes two Boolean values. Booleans can be indicated by predicate identifier names that end with a question mark <code>?</code>.
 
<syntaxhighlight lang="javascript">!logic:
(a? b?)
[
println("a and b: " a and b)
println("a or b: " a or b)
println("not a: " not a)
println("a xor b: " a xor b)
println("a nand b: " a nand b)
println("a nor b: " a nor b)
println("a not xor b: " a nxor b)
]
</syntaxhighlight>
 
Example call:
 
<syntaxhighlight lang="javascript">logic(true false)</syntaxhighlight>
 
=={{header|Slate}}==
{{lines too long|Slate}}
<langsyntaxhighlight lang="slate">{#/\. #\/. #not} do: [ |:func|
func arity = 1 ifTrue: [inform: 'True ' ; (func as: String) ; ' = ' ; (func sendTo: {True}) printString.
inform: 'False ' ; (func as: String) ; ' = ' ; (func sendTo: {False}) printString.].
Line 2,082 ⟶ 3,993:
[ |:each| inform: each first printString ; (func as: String) ; each second printString ; ' = ' ; (func sendTo: each) printString]]
 
].</langsyntaxhighlight>
 
{{out}}
Line 2,099 ⟶ 4,010:
{{works with|GNU Smalltalk}}
{{works with|Smalltalk/X}}
Logical operators "&"(and) and "|" (or) are evaluating their arg (i.e. <expr1> OP <expr2> will evaluate expr2 in any situation).
<lang smalltalk>|test|
<br>
There are also non-evaluating versions named "and:" and "or:", which only evaluate expr2 if the result is not already determined by expr1.
 
<syntaxhighlight lang="smalltalk">|test|
test := [ :a :b |
('%1 %2 %3 = %4' % { a. 'and'. b. (a & b) }) displayNl.
Line 2,109 ⟶ 4,024:
test value: false value: false.
test value: true value: false.
test value: false value: true.</langsyntaxhighlight>
 
 
{{works with|Smalltalk/X}}
<langsyntaxhighlight lang="smalltalk">a implies: b
a xor: b</langsyntaxhighlight>
 
=={{header|Standard ML}}==
 
<langsyntaxhighlight lang="sml">fun print_logic (a, b) = (
print ("a and b is " ^ Bool.toString (a andalso b) ^ "\n");
print ("a or b is " ^ Bool.toString (a orelse b) ^ "\n");
print ("not a is " ^ Bool.toString (not a) ^ "\n")
)</langsyntaxhighlight>
 
=={{header|Stata}}==
 
Stata does not have a boolean type, and uses instead 0 and 1 to denote resp. false and true.
 
<syntaxhighlight lang="stata">prog def bool
args a b
di `a'&`b'
di `a'|`b'
di !`a'
end</syntaxhighlight>
 
Likewise in Mata:
 
<syntaxhighlight lang="stata">function bool(a,b) {
printf("%f\n",a&b)
printf("%f\n",a|b)
printf("%f\n",!a)
}</syntaxhighlight>
 
=={{header|Swift}}==
 
<langsyntaxhighlight lang="swift">func logic(a: Bool, b: Bool) {
println("a AND b: \(a && b)");
println("a OR b: \(a || b)");
println("NOT a: \(!a)");
}</langsyntaxhighlight>
 
Additionally, ^ is used for XOR and == is used for "equal to" (a.k.a. bidirectional implication).
 
=={{header|Tcl}}==
<langsyntaxhighlight lang="tcl">proc logic {a b} {
puts "a and b: [expr {$a && $b}]"
puts "a or b: [expr {$a || $b}]"
puts "not a: [expr {!$a}]"
}</langsyntaxhighlight>
 
=={{header|Terraform}}==
The Hashicorp Configuration Language ( HCL ) does not support user defined functions. It only supports AND, OR and NOT logical operations. HCL is not meant for generic programming but I don't see an use case for a logarithm function in a language meant to provision infrastructure either. So......
 
<syntaxhighlight lang="terraform">
#Aamrun, August 15th 2022
 
variable "a" {
type = bool
default = true
}
 
variable "b" {
type = bool
default = false
}
 
output "a_and_b" {
value = var.a && var.b
}
 
output "a_or_b" {
value = var.a || var.b
}
 
output "not_a" {
value = !var.a
}
</syntaxhighlight>
'''Invocation and output :'''
<pre>
$ terraform apply -var="a=true" -var="b=false" -auto-approve
 
No changes. Your infrastructure matches the configuration.
 
Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are needed.
 
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
 
Outputs:
 
a_and_b = false
a_or_b = true
not_a = false
$
</pre>
 
=={{header|Toka}}==
Line 2,144 ⟶ 4,125:
that are the same as the well-formed flags in Forth.
 
<langsyntaxhighlight lang="toka">[ 0 <> [ ." true" ] [ ." false"] ifTrueFalse ] is .bool
[ ( a b -- )
cr ." a = " over .bool ." b = " dup .bool
Line 2,150 ⟶ 4,131:
cr ." a or b = " over or .bool
cr ." not a = " 0 = .bool
] is logic</langsyntaxhighlight>
 
=={{header|uBasic/4tH}}==
uBasic/4tH does not have logical operators, but every non-zero value will be considered ''TRUE'' in conditional statements. However, comparison operators (like =, #, < and >) can be used in expressions and will return fully qualified booleans. Hence, simple arithmetic operators will do the trick just fine.
<syntaxhighlight lang="text">Proc _Boolean(4, 2)
Proc _Boolean(0, 2)
Proc _Boolean(2, 0)
Line 2,169 ⟶ 4,150:
print "not A is "; a@ = 0 ' This will invert the boolean value
print
Return</langsyntaxhighlight>
{{out}}
<pre>A and B is 1
Line 2,185 ⟶ 4,166:
 
0 OK, 0:63</pre>
 
=={{header|UNIX Shell}}==
 
The shell has at least two levels of logical operators. Conditional logic (<tt>if</tt>, <tt>while</tt>, <tt>&&</tt> and <tt>||</tt> at the statement level) operates on commands; the commands are executed, and their exit status determines their value in a Boolean context. If they return an exit code of 0, signaling successful execution, that is considered a "true" result; if they return a nonzero exit code, signaling a failure condition, that is considered a "false" result. However, these results are not returned as a Boolean value. <tt>if command; then do something; fi</tt> will do something if the command succeeds, but there's no "true" value, only the zero exit status. So this demo uses a function that examines the exit status of the last command and prints "true" if it is 0 and "false" otherwise. The two values for the task are the <em>commands</em> <tt>true</tt> and <tt>false</tt>, which do nothing but exit with status 0 and 1, respectively.
 
{{works with|Bourne Again SHell}}
{{works with|Korn Shell}}
{{Works with|Z Shell}}
<syntaxhighlight lang="bash">function boolVal {
if (( ! $? )); then
echo true
else
echo false
fi
}
a=true
b=false
printf '%s and %s = %s\n' "$a" "$b" "$("$a" && "$b"; boolVal)"
printf '%s or %s = %s\n' "$a" "$b" "$("$a" || "$b"; boolVal)"
printf 'not %s = %s\n' "$a" "$(! "$a"; boolVal)"</syntaxhighlight>
{{Out}}
<pre>true and false = false
true or false = true
not true = false</pre>
 
A different variety of Boolean logic is available inside arithmetic expressions, using the C convention of 0=false and nonzero=true=1:
 
<syntaxhighlight lang="bash">a=1
b=0
printf '%d and %d = %d\n' "$a" "$b" "$(( a && b ))"
printf '%d or %d = %d\n' "$a" "$b" "$(( a || b ))"
printf 'not %d = %d\n' "$a" "$(( ! a ))"</syntaxhighlight>
 
{{Out}}
<pre>1 and 0 = 0
1 or 0 = 1
not 1 = 0</pre>
 
=={{header|V}}==
Using stack shuffles.
 
<langsyntaxhighlight lang="v">[mylogic
[get2 [dup] dip swap [dup] dip].
get2 and puts
Line 2,194 ⟶ 4,214:
swap not puts
pop
].</langsyntaxhighlight>
 
Using view.
<langsyntaxhighlight lang="v">[mylogic
[get2 [a b : a b a b] view].
get2 and puts
Line 2,203 ⟶ 4,223:
swap not puts
pop
].</langsyntaxhighlight>
 
Using internal defines
 
<langsyntaxhighlight lang="v">[mylogic [a b] let
a b and puts
a b or puts
a not puts
].</langsyntaxhighlight>
 
=={{header|Vala}}==
 
<syntaxhighlight lang="vala">public class Program {
private static void print_logic (bool a, bool b) {
print ("a and b is %s\n", (a && b).to_string ());
print ("a or b is %s\n", (a || b).to_string ());
print ("not a %s\n", (!a).to_string ());
}
public static int main (string[] args) {
if (args.length < 3) error ("Provide 2 arguments!");
bool a = bool.parse (args[1]);
bool b = bool.parse (args[2]);
print_logic (a, b);
return 0;
}
}</syntaxhighlight>
 
=={{header|Verilog}}==
<syntaxhighlight lang="verilog">module main;
integer a, b;
 
initial begin
a = 1; //true
b = 0; //false
$display(a && b); //AND
$display(a || b); //OR
$display(!a); //NOT
$finish ;
end
endmodule</syntaxhighlight>
 
=={{header|Visual Basic .NET}}==
 
<langsyntaxhighlight lang="vbnet">Function Test(ByVal a As Boolean, ByVal b As Boolean)
Console.WriteLine("And " & a And b)
Console.WriteLine("Or " & a Or b)
Line 2,222 ⟶ 4,273:
Console.WriteLine("And, short-circuited " & a AndAlso b)
Console.WriteLine("Or, short-circuited " & a OrElse b)
End Function</langsyntaxhighlight>
 
=={{header|Wren}}==
Wren has a built in Bool type which has two instances ''true'' and ''false'' which are also keywords.
 
The Bool class overrides the ''!'' operator which it inherits from the Object class so that ''!true'' is false and ''!false'' is true as one would expect.
 
Unlike some other C fanily languages, the Bool class doesn't support the operators ''&'', ''|'', ''^'' and ''~'' which, in Wren, only apply to bitwise operations on unsigned 32-bit integers.
 
However, it does support the short-circuiting ''&&'' and ''||'' logical operators as well as the conditional (or ternary) operator ''?:'' all of which behave as expected.
<syntaxhighlight lang="wren">var f = Fn.new { |a, b|
System.print("a = %(a)")
System.print("b = %(b)")
System.print("!a = %(!a)")
System.print("a && b = %(a && b)")
System.print("a || b = %(a || b)")
System.print()
}
 
var tests = [ [true, true], [true, false], [false, true], [false, false] ]
for (test in tests) f.call(test[0], test[1])</syntaxhighlight>
 
{{out}}
<pre>
a = true
b = true
!a = false
a && b = true
a || b = true
 
a = true
b = false
!a = false
a && b = false
a || b = true
 
a = false
b = true
!a = true
a && b = false
a || b = true
 
a = false
b = false
!a = true
a && b = false
a || b = false
</pre>
 
=={{header|XLISP}}==
<syntaxhighlight lang="lisp">(defun logical-functions (a b)
(print `(a and b = ,(and a b)))
(print `(a or b = ,(or a b)))
(print `(not a = ,(not a))) )</syntaxhighlight>
 
=={{header|XPL0}}==
Line 2,233 ⟶ 4,337:
convenient to combine logical and bitwise operations.
 
<langsyntaxhighlight XPL0lang="xpl0">include c:\cxpl\codes; \intrinsic 'code' declarations
 
func Logic(A, B);
Line 2,248 ⟶ 4,352:
Logic(1, 1); CrLf(0);
Logic(1, 2); CrLf(0);
]</langsyntaxhighlight>
 
{{out}}
Line 2,260 ⟶ 4,364:
 
=={{header|XSLT}}==
<langsyntaxhighlight lang="xml"><xsl:template name="logic">
<xsl:param name="a" select="true()"/>
<xsl:param name="b" select="false()"/>
Line 2,266 ⟶ 4,370:
<fo:block>a or b = <xsl:value-of select="$a or $b"/></fo:block>
<fo:block>not a = <xsl:value-of select="not($a)"/></fo:block>
</xsl:template></langsyntaxhighlight>
 
=={{header|zkl}}==
Logical and/or do the logic and returns one of the ops.
<langsyntaxhighlight lang="zkl">fcn f(a,b){a and b}
fcn g(a,b){a or b}
fcn h(a){(not a)}</langsyntaxhighlight>
<pre>
f(0,1) //-->0
890

edits