lib/axiom/function/connective/negation.rb
# encoding: utf-8
module Axiom
class Function
class Connective
# A logical negation of an expression
class Negation < Connective
include Unary::Invertible, Unary
undef_method :inverse
# Return the negation operation
#
# @example
# Negation.operation # => :!
#
# @return [Symbol]
#
# @api public
def self.operation
:'!'
end
# Evaluate the operands using a logical NOT
#
# @example with true operand
# Negation.call(true) # => false
#
# @example with false operand
# Negation.call(false) # => true
#
# @param [Boolean] operand
#
# @return [Boolean]
#
# @api public
def self.call(operand)
!operand
end
# Return the operand
#
# @example
# operand = negation.inverse
#
# @return [Function]
#
# @api public
def inverse
operand
end
module Methods
extend Aliasable
# alias #! to #inverse when available
inheritable_alias('!' => :inverse) if Object.method_defined?('!')
inheritable_alias(:- => :not)
# Negate the expression or logically AND and negate another expression
#
# @example with no argument
# negation = expression.not
#
# @example with other argument
# conjunction = expression.not(other)
#
# @return [Connective]
#
# @overload not
# Negates the expression
#
# @return [Negation]
#
# @overload not(other)
# Logically AND the other negated expression
#
# @param [Function] other
# optional other function to and
#
# @return [Conjunction]
#
# @api public
def not(other = Undefined)
if other.equal?(Undefined)
Negation.new(self)
else
self.and(Negation.new(other))
end
end
end # module Methods
Connective.class_eval { include Methods }
memoize :inverse
end # class Negation
end # class Connective
end # class Function
end # module Axiom