Logic/Linear.bruijn
# MIT License, Copyright (c) 2024 Marvin Borner
# binary logic but every abstraction is referred to *exactly once* (linearity)
# originally by "Harry G. Mairson" in "Linear lambda calculus and PTIME-completeness"
# could potentially be used for better visuals/graphs or more efficient reduction
# garbage collection hack
gc [0 [0] [0] [0]] ⧗ LinearBoolean → (a → a)
# true
true [[[0 2 1]]] ⧗ LinearBoolean
# false
false [[[0 1 2]]] ⧗ LinearBoolean
# inverts boolean value
not! [[[2 0 1]]] ⧗ LinearBoolean → LinearBoolean
¬‣ not!
:test (¬true) (false)
:test (¬false) (true)
# true if both args are true
and? [[1 0 false [[gc 0 1]]]] ⧗ LinearBoolean → LinearBoolean → LinearBoolean
…⋀?… 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)]] ⧗ LinearBoolean → LinearBoolean → LinearBoolean
: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 [[gc 0 1]]]] ⧗ LinearBoolean → LinearBoolean → LinearBoolean
…⋁?… 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)]] ⧗ LinearBoolean → LinearBoolean → LinearBoolean
:test (nor? true true) (false)
:test (nor? true false) (false)
:test (nor? false true) (false)
:test (nor? false false) (true)