### Booleans

[
  Datatype booleans      Alias bools
  Funcon   true
  Funcon   false
  Funcon   not
  Funcon   implies
  Funcon   and
  Funcon   or
  Funcon   exclusive-or  Alias xor
]


Datatype
  booleans ::= true | false
Alias
  bools = booleans


Funcon
  not(_:booleans) : =>booleans
/*
  `not(B)`   is logical negation.
*/
Rule
  not(false) ~> true
Rule
  not(true) ~> false


Funcon
  implies(_:booleans, _:booleans) : =>booleans 
/*
  `implies(B1, B2)` is logical implication.
*/
Rule
  implies(false, false) ~> true
Rule
  implies(false, true) ~> true
Rule
  implies(true, true) ~> true
Rule
  implies(true, false) ~> false


Funcon
  and(_:booleans*) : =>booleans
/*
  `and(B, ...)` is logical conjunction of any number of Boolean values.
*/
Rule
  and( ) ~> true
Rule
  and(false, _*:booleans*) ~> false  
Rule
  and(true, B*:booleans*) ~> and(B*)


Funcon
  or(_:booleans*) : =>booleans
/*
  `or(B, ...)` is logical disjunction of any number of Boolean values.
*/
Rule
  or( ) ~> false
Rule
  or(true, _*:booleans*) ~> true
Rule
  or(false, B*:booleans*) ~> or(B*)


Funcon
  exclusive-or(_:booleans, _:booleans) : =>booleans
Alias
  xor = exclusive-or
/*
  `exclusive-or(B1, B2)` is exclusive disjunction.
*/
Rule
  exclusive-or(false, false) ~> false
Rule
  exclusive-or(false, true)  ~> true
Rule
  exclusive-or(true, false)  ~> true
Rule
  exclusive-or(true, true)   ~> false