code: def distribute_AND_over_OR(expr):
      """
      Distributes AND over OR in the NNF expression.
      Returns the result( Conjunctive Normal Form of expression)
      as a CNF object.
      """
      if not isinstance(expr, (AND, OR)):
          tmp = set()
          tmp.add(frozenset((expr,)))
          return CNF(tmp)
  
      if isinstance(expr, OR):
          return CNF.all_or(
              *[distribute_AND_over_OR(arg) for arg in expr._args]
          )
  
      if isinstance(expr, AND):
          return CNF.all_and(
              *[distribute_AND_over_OR(arg) for arg in expr._args]
          )
  
imports: from itertools import combinations, product, zip_longest
  from sympy.assumptions.assume import AppliedPredicate, Predicate
  from sympy.core.relational import Eq, Ne, Gt, Lt, Ge, Le
  from sympy.core.singleton import S
  from sympy.logic.boolalg import Or, And, Not, Xnor
  from sympy.logic.boolalg import Equivalent, ITE, Implies, Nand, Nor, Xor
label_desc: Use image node_id 2 for calling a global function with example usage: distribute_AND_over_OR(expr) and returns: CNF, CNF, CNF