Home > front end >  How to apply DeMorgan's law in this C logical operation?
How to apply DeMorgan's law in this C logical operation?

Time:05-27

I want to compare three values if they're unique or not, and here's my first statement, which I want to simplify and make it more readable using the DeMorgan's Law.

product1Id != product2Id && product1Id != product3Id

CodePudding user response:

I want to compare three values if they're unique or not,

Your code doesn't ensure that. C(3,2) = 3!/2!/(3-2)! = 3 comparisons are needed, but you only have two. The following is the correct check:

product1Id != product2Id &&
product1Id != product3Id &&
product2Id != product3Id

I want to simplify and make it more readable

DeMorgan's laws can be used to obtain

!( product1Id == product2Id || product1Id == product3Id )

(See a few ways this is done below.)

It's debatable whether this is more readable or not.

But maybe the !( ) can be left out by exchanging the "then" and "else" clauses of an if statement, simplifying the expression to just

product1Id == product2Id || product1Id == product3Id

Also, say you had to repeatedly make this check with different values for product1Id, and say you had a large number of product ids against with to check. Then one could use

// Setup
ProductSet *set = ProductSet_new();
ProductSet_add( set, product2Id );
ProductSet_add( set, product3Id );

!( ProductSet_has( set, product1Id ) )

How to apply DeMorgan's law in this C logical operation?

Approach 1: Starting from !( A && B ) or !( A || B )

Let's start by synthesizing this form by introducing a double-negation.

!( !( product1Id != product2Id && product1Id != product3Id ) )
      |----------A-----------|    |----------B-----------|
   |----------------------!( A && B )----------------------|

Now, we can apply DeMorgan's second law (!( A && B )!A || !B).

   |--------------------------!A || !B--------------------------|
   |------------!A-------------|    |------------!B-------------|
      |----------A-----------|         |----------B-----------|
!( !( product1Id != product2Id ) || !( product1Id != product3Id ) )

Let's simplify using A == B!( A != B ).

!( product1Id == product2Id || product1Id == product3Id )

Approach 2a: Starting from !A && !B or !A || !B

Let's start by synthesizing this form by introducing double-negations.

!( !( product1Id != product2Id ) ) && !( !( product1Id != product3Id ) )
   |-------------A-------------|         |-------------B-------------|
|---------------!A---------------|    |---------------!B---------------|
|-------------------------------!A && !B-------------------------------|

Now, we can apply DeMorgan's first law (!( A || B )!A && !B).

|---------------------------!( A || B )---------------------------|
   |---------------------------A || B---------------------------|
   |-------------A-------------|    |-------------B-------------|
!( !( product1Id != product2Id ) || !( product1Id != product3Id ) )

Let's simplify using !( A != B )A == B.

!( product1Id == product2Id || product1Id == product3Id )

Approach 2b: Starting from !A && !B or !A || !B

Let's start by synthesizing this form using A != B!( A == B ).

!( product1Id == product2Id ) && !( product1Id == product3Id )
   |----------A-----------|         |----------B-----------|
|------------!A-------------|    |------------!B-------------|
|--------------------------!A && !B --------------------------|

Now, we can apply DeMorgan's first law (!( A || B )!A && !B).

|----------------------!( A || B )----------------------|
   |----------------------A || B----------------------|
   |----------A-----------|    |----------B-----------|
!( product1Id == product2Id || product1Id == product3Id )
  •  Tags:  
  • c
  • Related