allExpressions(noflevels, raw = FALSE, arrange = FALSE)createMatrix(noflevels)getRow(noflevels, row.no, zerobased = FALSE)
-1
.This is a set of functions dedicated to the implicant matrix, a space where all causal configurations and their minimized solutions are found.
They can produce all possible implicants and prime implicants, or all possible combinations for a specific number of causal conditions and their number of values (either binary or multi-value).
A truth table for binary crisp conditions is a matrix with $2^k$ rows, where $k$ is the number of causal conditions.
For multi-value causal conditions, the same equation can be generalised to:
$v_{1} * v_{2} * ... * v_{k}$
where $v$ is the number of values (levels) for every causal condition from 1 to k.
Implicant matrices contain all rows from the truth table, plus all of their supersets, (all implicants and prime implicants), including the empty set (Dusa 2007, 2010).
For a binary crisp set procedure, there are $3^k - 1$ possible expressions (groupings), see Ragin (2010). Including the empty set (the situation when all causal conditions have been minimized), the implicant matrix consists of exactly $3^k$ rows, including the truth table configurations.
In fact, $3^k$ is also obtained by the product:
$(2 + 1) * (2 + 1) * ... * (2 + 1)$
For multi-value causal conditions, the same equation can be generalised to:
$(v_{1} + 1) * (v_{2} + 1) * ... * (v_{k} + 1)$
where every number of levels in each causal conditions is incremented with 1, to allow coding the minimization of literals in each (prime) implicant (see examples).
The function allExpressions()
creates a matrix which contains all possible implicants
and prime implicants, displayed in the original values form using the code -1
to
point the minimized literals, while the other functions use the code 0
, all other
values being incremented with 1.
The function createMatrix()
creates a base matrix for truth tables and implicant
matrices.
The function getRow()
takes the number of a row in the truth table or implicant matrix
(in its decimal form), and transforms it into its binary (or multi-base) representation,
as a configuration of binary or multi-values for each causal condition.
Note that R is not a zero-based language (where all numbers start from 0), and positions in vectors and matrices start with 1. For this reason, although (mathematicall) the binary representation of the decimal number 0 (for example, at three causal conditions) is 0 0 0, in R that would be the first line in the implicant matrix, therefore 0 0 0 is translated into the number 1.
$v_{1} * v_{2} * ... * v_{k}$ rows if a truth table;
$(v_{1} + 1) * (v_{2} + 1) * ... * (v_{k} + 1)$ rows if an implicant matrix;
$x$ rows, equal to the length of row.no
.
Dusa, Adrian. 2007. Enhancing Quine-McCluskey. COMPASSS: Working Paper 2007-49. URL: http://www.compasss.org/wpseries/Dusa2007b.pdf.
Dusa, Adrian. 2010. A Mathematical Approach to the Boolean Minimization Problem. Quality & Quantity vol.44, no.1, pp.99-113.
Ragin, Charles C. (2000) Fuzzy-Set Social Science. Chicago: University of Chicago Press.
# three binary causal conditions, having two levels each: 0 and 1= noflevels <- c(2, 2, 2) # for three binary causal conditions allExpressions(noflevels)1 2 0 3 1 4 0 5 0 0 6 0 1 7 1 8 1 0 9 1 1 10 0 11 0 0 12 0 1 13 0 0 14 0 0 0 15 0 0 1 16 0 1 17 0 1 0 18 0 1 1 19 1 20 1 0 21 1 1 22 1 0 23 1 0 0 24 1 0 1 25 1 1 26 1 1 0 27 1 1 1# the same matrix, this time arranged better # (last rows represent the truth table) allExpressions(noflevels, arrange = TRUE)1 2 0 3 1 4 0 5 1 6 0 7 1 8 0 0 9 0 1 10 1 0 11 1 1 12 0 0 13 0 1 14 0 0 15 0 1 16 1 0 17 1 1 18 1 0 19 1 1 20 0 0 0 21 0 0 1 22 0 1 0 23 0 1 1 24 1 0 0 25 1 0 1 26 1 1 0 27 1 1 1# using the raw form allExpressions(noflevels, raw = TRUE)1 -1 -1 -1 2 -1 -1 0 3 -1 -1 1 4 -1 0 -1 5 -1 0 0 6 -1 0 1 7 -1 1 -1 8 -1 1 0 9 -1 1 1 10 0 -1 -1 11 0 -1 0 12 0 -1 1 13 0 0 -1 14 0 0 0 15 0 0 1 16 0 1 -1 17 0 1 0 18 0 1 1 19 1 -1 -1 20 1 -1 0 21 1 -1 1 22 1 0 -1 23 1 0 0 24 1 0 1 25 1 1 -1 26 1 1 0 27 1 1 1# create a truth table based on 3 conditions createMatrix(noflevels)[,1] [,2] [,3] [1,] 0 0 0 [2,] 0 0 1 [3,] 0 1 0 [4,] 0 1 1 [5,] 1 0 0 [6,] 1 0 1 [7,] 1 1 0 [8,] 1 1 1# its implicant matrix createMatrix(noflevels + 1)[,1] [,2] [,3] [1,] 0 0 0 [2,] 0 0 1 [3,] 0 0 2 [4,] 0 1 0 [5,] 0 1 1 [6,] 0 1 2 [7,] 0 2 0 [8,] 0 2 1 [9,] 0 2 2 [10,] 1 0 0 [11,] 1 0 1 [12,] 1 0 2 [13,] 1 1 0 [14,] 1 1 1 [15,] 1 1 2 [16,] 1 2 0 [17,] 1 2 1 [18,] 1 2 2 [19,] 2 0 0 [20,] 2 0 1 [21,] 2 0 2 [22,] 2 1 0 [23,] 2 1 1 [24,] 2 1 2 [25,] 2 2 0 [26,] 2 2 1 [27,] 2 2 2# create a truth table based on 3 conditions where the second has three levels createMatrix(c(2, 3, 2))[,1] [,2] [,3] [1,] 0 0 0 [2,] 0 0 1 [3,] 0 1 0 [4,] 0 1 1 [5,] 0 2 0 [6,] 0 2 1 [7,] 1 0 0 [8,] 1 0 1 [9,] 1 1 0 [10,] 1 1 1 [11,] 1 2 0 [12,] 1 2 1# deriving rows rows <- c(2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17) mat <- getRow(noflevels + 1, rows) # note the +1 rownames(mat) <- rows colnames(mat) <- c("A", "B", "C") matA B C 2 0 0 1 4 0 1 0 5 0 1 1 7 0 2 0 8 0 2 1 10 1 0 0 11 1 0 1 13 1 1 0 14 1 1 1 16 1 2 0 17 1 2 1# implicant matrix normal values # A B C | A B C # 2 0 0 1 | 2 - - 0 c # 4 0 1 0 | 4 - 0 - b # 5 0 1 1 | 5 - 0 0 bc # 7 0 2 0 | 7 - 1 - B # 8 0 2 1 | 8 - 1 0 Bc # 10 1 0 0 | 10 0 - - a # 11 1 0 1 | 11 0 - 0 ac # 13 1 1 0 | 13 0 0 - ab # 14 1 1 1 | 14 0 0 0 abc # 16 1 2 0 | 16 0 1 - aB # 17 1 2 1 | 17 0 1 0 aBc