Copyright | Copyright (C) 2021 Yoo Chung |
---|---|

License | GPL-3.0-or-later |

Maintainer | dev@chungyc.org |

Safe Haskell | Safe-Inferred |

Language | GHC2021 |

Part of Ninety-Nine Haskell Problems. Some solutions are in Solutions.P46.

# Documentation

type BoolFunc = Bool -> Bool -> Bool Source #

Define boolean functions `and'`

, `or'`

, `nand'`

,
`nor'`

, `xor'`

, `impl'`

, and `equ'`

,
which succeed or fail according to the result of their respective operations;
e.g., `(and' a b)`

is true if and only if both `a`

and `b`

are true.
Do not use the builtin boolean operators.

A logical expression in two variables can then be written as in the following example:

\a b -> and' (or' a b) (nand' a b)

Write a function `table`

which returns
the truth table of a given logical expression in two variables.

### Notes

There is no technical reason to define the type synonym `BoolFunc`

.
However, it is a good place to explain the entire problem
without talking about writing truth table functions first,
especially for inclusion in the documentation for Problems.

The original problem for Haskell
required that the truth table be printed:
*"Now, write a predicate table/3 which prints the truth table of a given logical expression in two variables."*
It was changed here to return a list of boolean tuples, because the requirement
for I/O seemed uninteresting in the context of the rest of the problem.

Documentation for the expected semantics for each boolean function was added,
and the example for `table`

was modified to avoid sensitivity to order.

table :: BoolFunc -> [(Bool, Bool, Bool)] Source #

Truth tables for logical expressions with two operands.

The truth table will be a list of `(`

tuples.
If `Bool`

, `Bool`

, `Bool`

)`f`

is the logical expression, a tuple `(a, b, c)`

in the list
will mean that `(f a b == c)`

. The list will include all possible
distinct combinations of the tuples.

### Examples

`>>>`

False False False False True False True False True True True True`printTable $ table (\a b -> (and' a (or' a b)))`

# Boolean functions

Logical conjunction.
I.e., `(and' a b)`

is true if and only if both `a`

and `b`

are true.

### Examples

`>>>`

False`and' True False`

Logical disjuncton.
I.e., `(or' a b)`

is true if and only if one or both of `a`

and `b`

are true.

### Examples

`>>>`

True`or' True False`

Logical alternative denial.
I.e., `(nand' a b)`

is true if and only if `(and' a b)`

is false.

### Examples

`>>>`

True`nand' True False`

Logical joint denial.
I.e., `(nor' a b)`

is true if and only if `(or' a b)`

is false.

### Examples

`>>>`

False`nor' True False`

Logical exclusive disjunction.
I.e., `(xor' a b)`

is true if and only if exactly one of `a`

and `b`

is true.

### Examples

`>>>`

True`xor' True False`

Logical implication.
I.e., `(impl' a b)`

being true means `b`

must be true if `a`

is true.
If `a`

is false, there is no implication as to what `b`

should be.

### Examples

`>>>`

False`impl' True False`

Logical equivalence.
I.e., `(equ' a b)`

being true means `a`

is true if and only if `b`

is true.

### Examples

`>>>`

False`equ' True False`