Logic/Affine.bruijn


# MIT License, Copyright (c) 2026 Marvin Borner
# binary logic but every abstraction is referred to *at most once* (affinity)
# heavily inspired by Logic/Linear; there might also be affine Church operators!

# true
true [[[0 2 1]]] ⧗ AffineBoolean

# false
false [[[0 1 2]]] ⧗ AffineBoolean

# inverts boolean value
not! [[[2 0 1]]] ⧗ AffineBoolean → AffineBoolean

¬‣ not!

:test (¬true) (false)
:test (¬false) (true)

# true if both args are true
and? [[1 0 false [[1]]]] ⧗ AffineBoolean → AffineBoolean → AffineBoolean

…⋀?… and?

:test (true ⋀? true) (true)
:test (true ⋀? false) (false)
:test (false ⋀? true) (false)
:test (false ⋀? false) (false)

# true if not both args are true
nand? [[not! (and? 1 0)]] ⧗ AffineBoolean → AffineBoolean → AffineBoolean

:test (nand? true true) (false)
:test (nand? true false) (true)
:test (nand? false true) (true)
:test (nand? false false) (true)

# true if one of the args is true
or? [[1 true 0 [[1]]]] ⧗ AffineBoolean → AffineBoolean → AffineBoolean

…⋁?… or?

:test (true ⋁? true) (true)
:test (true ⋁? false) (true)
:test (false ⋁? true) (true)
:test (false ⋁? false) (false)

# true if both args are false
nor? [[not! (or? 1 0)]] ⧗ AffineBoolean → AffineBoolean → AffineBoolean

:test (nor? true true) (false)
:test (nor? true false) (false)
:test (nor? false true) (false)
:test (nor? false false) (true)