lib/magic_logic.rb in magic_logic-0.0.1 vs lib/magic_logic.rb in magic_logic-0.0.2
- old
+ new
@@ -1,37 +1,37 @@
require "magic_logic/version"
module MagicLogic
module Operator
- def ~@
- if is_neg? then p
- elsif is_form? then vars.map(&:~).inject(reope)
- else NEG.new(self)
- end
+ def _ ope, l, r
+ ope == :+ ? l : r
end
- def *(q)
- case q
- when Taut then self
- when UTaut then $utout
- when self then self
- else
- if neg?(q) then $utout
- else FORM.new([self, q], :*)
+ [:+, :*].each do |ope|
+ define_method(ope) do |q|
+ case q
+ when Taut then _ ope, $tout, self
+ when UTaut then _ ope, self, $utout
+ when self then self
+ else
+ if neg?(q)
+ (_ ope, $tout, $utout)
+ elsif is_form?(ope.to_sym) && include?(q)
+ self
+ elsif q.is_form?(ope) && q.include?(self)
+ q
+ else
+ FORM.new([self, q], ope)
+ end
end
end
end
- def +(q)
- case q
- when Taut then $tout
- when UTaut then self
- when self then self
- else
- if neg?(q) then $tout
- else FORM.new([self, q], :+)
- end
+ def ~@
+ if is_neg? then p
+ elsif is_form? then vars.map(&:~).inject(_ ope, :*, :+)
+ else NEG.new(self)
end
end
def >=(q)
(~self + q)
@@ -50,11 +50,11 @@
def is_neg?
is_a?(NEG)
end
def is_form?(ope=nil)
- return is_a?(FORM) && @ope == ope if ope
+ return is_a?(FORM) && self.ope == ope if ope
is_a?(FORM)
end
def is_or?
is_form?(:+)
@@ -66,12 +66,12 @@
def include?(p)
false
end
- def dpll!
- !!!!!!!!!!!!self
+ def dpll
+ !!!!!!!!!!!!!!!!!!self
end
end
module Base; include Operator; include Utils end
@@ -97,31 +97,35 @@
end
$utout = UTaut.new
class Atom < Struct.new(:p)
include Base
- def to_s; p.to_s end
- def !@; self end
- def depth; 1 end
+ def to_s; p.to_s end
+ def !@; self end
+ def depth; 1 end
+
+ class << self
+ alias [] new
+ end
end
+ P = Atom
class NEG < Struct.new(:p)
include Base
- def to_s; "~#{p}" end
- def !@; ~(!p) end
- def depth; p.depth+1 end
+ def to_s; "~#{p}" end
+ def !@; ~(!p) end
+ def depth; p.depth+1 end
end
- class FORM
+ class FORM < Struct.new(:vars, :ope)
include Base
- attr_reader :vars, :ope
def initialize(vars, ope)
- @vars = vars.map { |var| var.is_form?(ope) ? var.vars : var }.flatten
- @ope = ope
+ self.vars = vars.map { |var| var.is_form?(ope) ? var.vars : var }.flatten
+ self.ope = ope
end
- def to_s; "(#{vars.map(&:to_s).join(loope)})" end
+ def to_s; "(#{vars.map(&:to_s).join(_ ope, '|', '&')})" end
def !@
if is_or? && (and_form = vars.find { |var| var.is_and? })
and_form.vars.map { |a| a + FORM.new((vars - [and_form]), :+) }.inject(:*)
elsif are_there_neg?
@@ -135,23 +139,21 @@
def include?(p)
vars.include?(p)
end
- def loope
- ope == :* ? '&' : '|'
- end
-
- def reope
- is_and? ? :+ : :*
- end
-
private
def are_there_neg?
pvars = vars.reject { |var| var.is_neg? }
nvars = vars.select { |var| var.is_neg? }
pvars.any? { |pvar|
nvars.any? { |nvar| nvar.neg?(pvar) }
}
end
+ end
+
+ class ::Array
+ def >>(con)
+ inject($tout) { |s, p| s * p } >= con
+ end
end
end