...
Tawesoft Logo

Source file src/tawesoft.co.uk/go/operator/bool.go

Documentation: src/tawesoft.co.uk/go/operator/bool.go

     1  package operator
     2  
     3  type boolUnary struct {
     4      True            func(bool) bool
     5      False           func(bool) bool
     6      Identity        func(bool) bool
     7      Not             func(bool) bool
     8  }
     9  
    10  type boolBinary struct{
    11      True            func(bool, bool) bool // always returns true
    12      False           func(bool, bool) bool // always returns false
    13      P               func(bool, bool) bool // for (p, q) returns p
    14      Q               func(bool, bool) bool // for (p, q) returns q
    15      NotP            func(bool, bool) bool // for (p, q) returns ¬ p
    16      NotQ            func(bool, bool) bool // for (p, q) returns ¬ q
    17      Eq              func(bool, bool) bool // same as XNOR
    18      Neq             func(bool, bool) bool // same as XOR
    19      And             func(bool, bool) bool
    20      Nand            func(bool, bool) bool
    21      Or              func(bool, bool) bool
    22      Nor             func(bool, bool) bool
    23      Xor             func(bool, bool) bool // same as Neq
    24      Xnor            func(bool, bool) bool // same as Eq
    25      Implies         func(bool, bool) bool // for (p, q) returns p -> q
    26      NonImplies      func(bool, bool) bool // non implication; for (p, q) returns ¬ (p -> q)
    27      ConImplies      func(bool, bool) bool // converse implies; for (p, q) returns (q -> p)
    28      ConNonImplies   func(bool, bool) bool // converse not implies; for (p, q) returns ¬ (q -> p)
    29  }
    30  
    31  type boolNary struct{
    32      True            func(...bool) bool // always returns true
    33      False           func(...bool) bool // always returns false
    34      
    35      All             func(...bool) bool // returns true if all are true a.k.a. a AND b AND c ...
    36      Any             func(...bool) bool // returns true if any are true a.k.a. a OR b OR c
    37      None            func(...bool) bool // returns true if none are true (all are false)
    38  }
    39  
    40  // Bool implements operations on one (unary), two (binary), or many (nary) arguments of type bool.
    41  var Bool = struct {
    42      Unary  boolUnary
    43      Binary boolBinary
    44      Nary   boolNary
    45  }{
    46      Unary: boolUnary{
    47          True:       func(_ bool) bool { return true},
    48          False:      func(_ bool) bool { return false},
    49          Identity:   func(p bool) bool { return p },
    50          Not:        func(p bool) bool { return !p },
    51      },
    52      
    53      Binary: boolBinary{
    54          True:       func(_ bool, _ bool) bool { return true },
    55          False:      func(_ bool, _ bool) bool { return false },
    56          P:          func(p bool, _ bool) bool { return p },
    57          Q:          func(_ bool, q bool) bool { return q },
    58          NotP:       func(p bool, _ bool) bool { return !p },
    59          NotQ:       func(_ bool, q bool) bool { return !q },
    60          Eq:         func(p bool, q bool) bool { return p == q },
    61          Neq:        func(p bool, q bool) bool { return p != q },
    62          And:        func(p bool, q bool) bool { return p && q },
    63          Nand:       func(p bool, q bool) bool { return !(p && q) },
    64          Or:         func(p bool, q bool) bool { return p || q },
    65          Nor:        func(p bool, q bool) bool { return !(p || q) },
    66          Xor:        func(p bool, q bool) bool { return p != q },
    67          Xnor:       func(p bool, q bool) bool { return p == q },
    68          Implies:    func(p bool, q bool) bool { return (!p) || q },
    69          NonImplies: func(p bool, q bool) bool { return p && (!q) },
    70          ConImplies: func(p bool, q bool) bool { return (!q) || p },
    71          ConNonImplies: func(p bool, q bool) bool { return q && (!p) },
    72      },
    73      
    74      Nary: boolNary{
    75          True:       func(_...bool) bool { return true },
    76          False:      func(_...bool) bool { return false },
    77          All:        boolNaryAll1,
    78          Any:        boolNaryAny1,
    79          None:       boolNaryNone1,
    80      },
    81  }
    82  
    83  func boolNaryAll1(p...bool) bool {
    84      for i := 0; i < len(p); i++ {
    85          if !p[i] { return false }
    86      }
    87      return true
    88  }
    89  
    90  func boolNaryAll2(p...bool) (result bool) {
    91      result = true
    92      for i := 0; i < len(p); i++ {
    93          result = result && p[i]
    94      }
    95      return result
    96  }
    97  
    98  func boolNaryAny1(p...bool) bool {
    99      for i := 0; i < len(p); i++ {
   100          if p[i] { return true }
   101      }
   102      return false
   103  }
   104  
   105  func boolNaryAny2(p...bool) (result bool) {
   106      for i := 0; i < len(p); i++ {
   107          result = result || p[i]
   108      }
   109      return result
   110  }
   111  
   112  func boolNaryNone1(p...bool) bool {
   113      for i := 0; i < len(p); i++ {
   114          if p[i] { return false }
   115      }
   116      return true
   117  }
   118  
   119  func boolNaryNone2(p...bool) (result bool) {
   120      result = false
   121      for i := 0; i < len(p); i++ {
   122          result = result || p[i]
   123      }
   124      return !result
   125  }
   126  
   127  

View as plain text