ninetynine-1.3.0: Ninety-Nine Haskell Problems
CopyrightCopyright (C) 2023 Yoo Chung
LicenseGPL-3.0-or-later
Maintainerdev@chungyc.org
Safe HaskellSafe-Inferred
LanguageGHC2021

Solutions.P46

Description

Some solutions to Problems.P46 of Ninety-Nine Haskell Problems.

Synopsis

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

Expand

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.

Boolean functions

and' :: BoolFunc Source #

Logical conjunction. I.e., (and' a b) is true if and only if both a and b are true.

or' :: BoolFunc Source #

Logical disjuncton. I.e., (or' a b) is true if and only if one or both of a and b are true.

nand' :: BoolFunc Source #

Logical alternative denial. I.e., (nand' a b) is true if and only if (and' a b) is false.

nor' :: BoolFunc Source #

Logical joint denial. I.e., (nor' a b) is true if and only if (or' a b) is false.

xor' :: BoolFunc Source #

Logical exclusive disjunction. I.e., (xor' a b) is true if and only if exactly one of a and b is true.

impl' :: BoolFunc Source #

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.

equ' :: BoolFunc Source #

Logical equivalence. I.e., (equ' a b) being true means a is true if and only if b is true.

Utility values

functions :: Functions Source #

Functions in this module grouped together.

They are grouped together for testing or benchmarking purposes.