Boolean functions and truth tables
----------------------------------
NB: There is substantial overlap between this article and Phil Last's →logic←.
Boolean functions may be represented as "truth tables". Here are truth tables
for ∧ (and), ∨ (or) and ≠ (not-equal):
∧ 0 1 ∨ 0 1 ≠ 0 1
┌───┬───┐ ┌───┬───┐ ┌───┬───┐
0 │ 0 │ 0 │ 0 │ 0 │ 1 │ 0 │ 0 │ 1 │
├───┼───┤ ├───┼───┤ ├───┼───┤
1 │ 0 │ 1 │ 1 │ 1 │ 1 │ 1 │ 1 │ 0 │
└───┴───┘ └───┴───┘ └───┴───┘
We can represent these results in a more compact form by raveling the matrix:
∧ 0 0 0 1 ∨ 0 1 1 1 ≠ 0 1 1 0
Notice that each of the above vectors is the result of applying its dyadic func-
tion between arguments 0 0 1 1 and 0 1 0 1.
Here is the complete list of boolean functions:
{⍺∧0∧⍵} 0 0 0 0 ⍝ boolean functions (pervasive).
∧ 0 0 0 1
> 0 0 1 0
{⍺∨0∧⍵} 0 0 1 1
< 0 1 0 0
{⍵∨0∧⍺} 0 1 0 1
≠ 0 1 1 0
∨ 0 1 1 1
⍱ 1 0 0 0
= 1 0 0 1
{⍵⍲1∨⍺} 1 0 1 0
≥ 1 0 1 1
{⍺⍲1∨⍵} 1 1 0 0
≤ 1 1 0 1
⍲ 1 1 1 0
{⍺∨1∨⍵} 1 1 1 1
We can check this by accumulating a list-of-functions, using operator →lof←, to
apply each function in turn:
bfns←{''} ⍝ initial boolean functions vector ...
bfns ← bfns lof {⍺∧0∧⍵} ⍝ boolean functions (pervasive).
bfns ← bfns lof ∧
bfns ← bfns lof >
bfns ← bfns lof {⍺∨0∧⍵}
bfns ← bfns lof <
bfns ← bfns lof {⍵∨0∧⍺}
bfns ← bfns lof ≠
bfns ← bfns lof ∨
bfns ← bfns lof ⍱
bfns ← bfns lof =
bfns ← bfns lof {⍵⍲1∨⍺}
bfns ← bfns lof ≥
bfns ← bfns lof {⍺⍲1∨⍵}
bfns ← bfns lof ≤
bfns ← bfns lof ⍲
bfns ← bfns lof {⍺∨1∨⍵}
↑ 0 0 1 1 bfns 0 1 0 1 ⍝ check (pervasive) boolean functions.
0 0 0 0
0 0 0 1
0 0 1 0
0 0 1 1
0 1 0 0
0 1 0 1
0 1 1 0
0 1 1 1
1 0 0 0
1 0 0 1
1 0 1 0
1 0 1 1
1 1 0 0
1 1 0 1
1 1 1 0
1 1 1 1
For depth=0 arguments, the non-scalar (D) functions may be greatly simplified,
as they are then not required to pervade their arguments:
{0} 0 0 0 0 ⍝ boolean functions (non-pervasive).
∧ 0 0 0 1
> 0 0 1 0
⊣ 0 0 1 1
< 0 1 0 0
⊢ 0 1 0 1
≠ 0 1 1 0
∨ 0 1 1 1
⍱ 1 0 0 0
= 1 0 0 1
{~⍵} 1 0 1 0
≥ 1 0 1 1
{~⍺} 1 1 0 0
≤ 1 1 0 1
⍲ 1 1 1 0
{1} 1 1 1 1
(
Of course, each of the above D-functions may be made pervasive by binding
it with the →perv← operator:
0 1 ⊢perv ⊂0 1
0 1 0 1
0 1 ⊣perv ⊂0 1
0 0 1 1
.. etc.
)
Boolean scans
-------------
Many of the functions derive interesting functions with scan (\). For example:
∧\ ⍝ leading 1s
<\ ⍝ first 1
≠\ ⍝ toggle at 1s
...\
{0}\ ⍝ first item, then 0s. See →baby←
See also: lof baby logic
Back to: contents
Back to: Workspaces