[erlang-questions] nand problem

Richard A. O'Keefe ok@REDACTED
Fri Jan 30 06:16:00 CET 2015

```On 27/01/2015, at 5:21 am, Roelof Wobben <r.wobben@REDACTED> wrote:

> Hello,
>
> I now have to make a nand boolean with pattern matching.
> I have found out that nand is true except when its true and true.
>
> as hint I get to implement nand using and and or.

You can't.  If you think of the Booleans as the lattice
with carrier {false,true} and false < true,
"and" is min and "or" is max, both of which are monotone
non-decreasing.  Any composition of monotone non-decreasing
functions is monotone non-decreasing.  But
nand(false,false) = true > false = nand(true,true),
so nand is NOT monotone non-decreasing and cannot be a
composition of ands and ors.

It's actually the other way around.  Another name for 'nand'
is the "Sheffer stroke", and you can make all the 1 or 2
argument Boolean operators from *it*.

Look, the simplest possible approach is just to write down
the truth table:

true  nand true  = false
true  nand false = true
false nand true  = true
false nand false = true

and change it to Erlang syntax:

nand(true,  true)  -> false;
nand(true,  false) -> true;
nand(false, true)  -> true;
nand(false, false) -> true.

Dollars to doughnuts doing it this way was the point of the exercise.

After this,

not(X) -> nand(X, X).

and(X, Y) -> not(nand(X, Y)).

or(X, Y) -> nand(not(X), not(Y)).

Now try material implication, where (X imp Y) is true when Y
is true or X is false.

```