class_docstr: ai - prover of logic rules
  
  given a set of initial rules, Prover tries to prove all possible rules
  which follow from given premises.
  
  As a result proved_rules are always either in one of two forms: alpha or
  beta:
  
  Alpha rules
  -----------
  
  This are rules of the form::
  
    a -> b & c & d & ...
  
  
  Beta rules
  ----------
  
  This are rules of the form::
  
    &(a,b,...) -> c & d & ...
  
  
  i.e. beta rules are join conditions that say that something follows when
  *several* facts are true at the same time.
docstr: process a -> b rule
docstr_tok: ["process","a","-",">","b","rule"]
code: def process_rule(self, a, b):
      """process a -> b rule"""  # TODO write more?
      if (not a) or isinstance(b, bool):
          return
      if isinstance(a, bool):
          return
      if (a, b) in self._rules_seen:
          return
      else:
          self._rules_seen.add((a, b))
  
      # this is the core of processing
      try:
          self._process_rule(a, b)
      except TautologyDetected:
          pass
  
imports: from collections import defaultdict
  from typing import Iterator
  from .logic import Logic, And, Or, Not
label_desc: Use image node_id 5 for calling the Prover obj's underlying member method code with example usage: obj.process_rule(a, b) without return types