How to solve Boolean Parenthesization Problem in Python

In this tutorial, we will learn about an array 1/0 operand and another array operator.
The number of different methods (parentheses) used to group these operands is always correct.
Operators will always be one of these: & ;; |, ^ (And, or XOR). Its called a Boolean parenthesis problem.

For example 1:

Operation = [1,0,0]
Operator = [|, ^]

Then the above methods can have parentheses to get 1:
1 | (0 ^ 0)
(1 | 0) ^ 0 |

For example 2:

Operation = [1, 0, 1]
Operator = [|, ^, and]

Ways to generate 1:
(1 | (0 ^ 0)) and 1
((1 | 0) ^ 0) & 1

Solution:
So, we say that T (i, j) represents the number of ways of evaluating 1 and i.
0 (i, j) represents the number of ways to evaluate from 0 between i and j.

then T(i,j) =

summation() for all k between i and j

    if operator[k] is &,   T(i,k) * T(k+1,j)

    if operator[k] is |,   T(i,k) * T(k+1,j)  +   F(i,k) * T(k+1,j)  +   T(i,k) * F(k+1,j)

    if operator[k] is ^,   F(i,k) * T(k+1,j)  +   T(i,k) * F(k+1,j)

and F(i,j) =

summation() for all k between i and j

    if operator[k] is &,   F(i,k) * F(k+1,j)  +   F(i,k) * T(k+1,j)   +   T(i,k) * F(k+1,j)

    if operator[k] is |,   F(i,k) * F(k+1,j)

    if operator[k] is ^,   T(i,k) * T(k+1,j)  +   F(i,k) * F(k+1,j)
 def countParenth(symb, oper, n): 
  F = [[0 for i in range(n + 1)] 
      for i in range(n + 1)] 
  T = [[0 for i in range(n + 1)] 
      for i in range(n + 1)] 
       
  for i in range(n): 
    if symb[i] == 'F': 
      F[i][i] = 1
    else: 
      F[i][i] = 0

    if symb[i] == 'T': 
      T[i][i] = 1
    else: 
      T[i][i] = 0
      
  for gap in range(1, n): 
    i = 0
    for j in range(gap, n): 
      T[i][j] = F[i][j] = 0
      for g in range(gap): 
        
        
        k = i + g 
        
         
        tik = T[i][k] + F[i][k]; 
        tkj = T[k + 1][j] + F[k + 1][j]; 
        
     
        if oper[k] == '&': 
          T[i][j] += T[i][k] * T[k + 1][j] 
          F[i][j] += (tik * tkj - T[i][k] *
                      T[k + 1][j]) 
        if oper[k] == '|': 
          F[i][j] += F[i][k] * F[k + 1][j] 
          T[i][j] += (tik * tkj - F[i][k] *
                      F[k + 1][j]) 
        if oper[k]=='^': 
          T[i][j] += (F[i][k] * T[k + 1][j] +
                T[i][k] * F[k + 1][j]) 
          F[i][j] += (T[i][k] * T[k + 1][j] +
                F[i][k] * F[k + 1][j]) 
      i += 1
  return T[0][n - 1] 
   
symbols = "TTFT"
operators = "|&^"
n = len(symbols) 
 
print(countParenth(symbols, operators, n)) 

Output:

4

Time Complexity:

Complexity of  dynamic programming approach to find ways to parenthesize a Boolean expression to evaluate it to True is O(n^3). and space complexity is O(n^2).

Leave a Reply

Your email address will not be published. Required fields are marked *