Skip to content

Instantly share code, notes, and snippets.

@edwardkenfox
Last active September 26, 2018 01:16
Show Gist options
  • Save edwardkenfox/122fe48cfcab188a70e9e29e3c1a79a3 to your computer and use it in GitHub Desktop.
Save edwardkenfox/122fe48cfcab188a70e9e29e3c1a79a3 to your computer and use it in GitHub Desktop.
algebra set computation using tree structure
class Tree
attr_accessor :root
def initialize(root)
@root = root
end
def insert(parent, left, right)
parent.left = left
parent.right = right
left.parent = parent
right.parent = parent
end
def resolve
root.resolve
end
end
class Node
attr_accessor :parent, :left, :right, :operator, :condition
def initialize(operator, condition)
@parent = @left = @right = nil
@operator = operator
@condition = condition
end
def leaf?
operator.nil? && !condition.nil?
end
def resolve
if leaf?
condition
else
operate(left, right, operator)
end
end
def operate(left, right, operator)
case operator
when "AND"
left.resolve & right.resolve
when "OR"
left.resolve | right.resolve
when "AND NOT"
left.resolve ^ right.resolve
else
raise "unknown operator"
end
end
end
root = Node.new("AND", nil)
tree = Tree.new(root)
node1 = Node.new("OR", nil)
node1_1 = Node.new(nil, true)
node1_2 = Node.new(nil, false)
tree.insert(node1, node1_1, node1_2)
node2 = Node.new(nil, true)
tree.insert(root, node1, node2)
puts tree.resolve
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment