version 3.22
Functions to negate a DNF/SOP expression, or to invert SOP to POS or POS to SOP.
negate(input, snames = "", noflevels, simplify = TRUE)invert(input, snames = "", noflevels)
input |
A string representing a SOP expresson, or a minimization
object of class "QCA_min" . |
|||
snames |
A string containing the sets' names, separated by commas. | |||
noflevels |
Numerical vector containing the number of levels for each set. | |||
simplify |
Logical, allow users to choose between the raw negation or its simplest form. |
In Boolean algebra, there are two transformation rules named after the British mathematician Augustus De Morgan. These rules state that:
1. The complement of the union of two sets is the intersection of their complements.
2. The complement of the intersection of two sets is the union of their complements.
In "normal" language, these would be written as:
1. not (A and B) = (not A) or (not B)
2. not (A or B) = (not A) and (not B)
Based on these two laws, any Boolean expression written in disjunctive normal form can be transformed into its negation.
It is also possible to negate all models and solutions from the result of a
Boolean minimization from function minimize()
.
The resulting object, of class "qca"
, is automatically recognised by this
function.
In a SOP expression, the products should normally be split by using a star
*
sign, otherwise the sets' names will be considered the individual
letters in alphabetical order, unless they are specified via snames
.
To negate multilevel expressions, the argument noflevels
is required.
It is entirely possible to obtain multiple negations of a single expression, since the
result of the negation is passed to function simplify()
.
Ragin, Charles C. 1987. The Comparative Method: Moving beyond Qualitative and Quantitative Strategies. Berkeley: University of California Press.
# example from Ragin (1987, p.99) negate("AC + B~C", simplify = FALSE)N1: ~A~B + ~AC + ~B~C# the simplified, logically equivalent negation negate("AC + B~C")N1: ~AC + ~B~C# with different intersection operators negate("AB*EF + ~CD*EF")N1: ~EF + ~AB*CD# invert to POS invert("a*b + ~c*d")N1: (~a + ~b)*(c + ~d)# using an object of class "qca" produced with minimize() cLC <- minimize(LC, outcome = "SURV") negate(cLC)M1: DEV*~URB*LIT*STB + DEV*LIT*IND*STB N1: ~DEV + ~LIT + ~STB + URB*~IND# parsimonious solution pLC <- minimize(LC, outcome = "SURV", include = "?") negate(pLC)M1: DEV*STB N1: ~DEV + ~STB