logic_tools 0.3.0 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5306034ce28f57c0fb9ee57b9d5c3643682f99e2
4
- data.tar.gz: f879af69f02c8d96e94e2dfeccc270147d6e621d
3
+ metadata.gz: 050637aebd4a23cf2fad66977655693b4bfec213
4
+ data.tar.gz: 633b3b494230e852f4bb4f5b41bf6cfc445de661
5
5
  SHA512:
6
- metadata.gz: aefc4e9df205c84a42b3157281048ce8c98fe4f097a0d3e3441b0fe13fa8490a4727c66d73aaa92b1af10e1b1ee5c03805e3f941f1f8ae3dc8f563a4d1379a9a
7
- data.tar.gz: 03eb53a6df7171d407f6f29f116d3e0ad718767cba29ff4dc19c2bf6bbbc1d6e4ef38754eac8491c2a027008f841fdfd330da36a5f815c7a02a2d751d4ddcc6e
6
+ metadata.gz: a61b43345ddf05b11fbf9dd01a19bd4c8570e8d609e4a5d4da58a2bd786eb19c2ec028489cdaed9b4801f76681bb97e18c321d39e52dfd91463801324e9659d6
7
+ data.tar.gz: 017c29e9181dc2421f4260a5852d515de011088a9e495e55f21c6d511246435460ee54ef1079a89350b1d654120e9f00fa5e3656046ba4c6f92b0421a389bcf1
data/README.md CHANGED
@@ -4,9 +4,12 @@ LogicTools is a set of command-line tools for processing logic expressions.
4
4
  The tools include:
5
5
 
6
6
  * __simplify\_qm__: for simplifying a logic expression.
7
+ * __simplify\_es__: for simplifying a logic expression (much more efficient than simplify_qm).
7
8
  * __std\_conj__: for computing the conjunctive normal form of a logic expression.
8
9
  * __std\_dij__: for computing the disjunctive normal form a of logic expression.
9
10
  * __truth\_tbl__: for generating the truth table of a logic expression.
11
+ * __is\_tautolofy__: for checking if a logic expression is a tautology or not.
12
+ * __complement__: for computing the complement of a logic expression.
10
13
 
11
14
 
12
15
  ## Installation
@@ -37,7 +40,7 @@ Multiple expressions stored into a file can also be processed as follows:
37
40
 
38
41
  The logical expression is an expression where:
39
42
 
40
- * a logical variable is represented by a single alphabetical character (hence there is in total 56 possible variables);
43
+ * a logical variable is represented by a single alphabetical character (hence there is in total 56 possible variables), or a string of alphabetical characters enclosed by curly brackets.
41
44
  * a logical OR is represented by a '+' character;
42
45
  * a logical AND is represented by a '.' character (but it can be omitted);
43
46
  * a logical NOT is represented by a '~' or a '!' character;
@@ -54,6 +57,7 @@ For instance the followings are valid logical expression using the a,b and c var
54
57
  "a.b.c"
55
58
  "a+b+!c"
56
59
  "a~(b+~c)"
60
+ "{foo}+{bar}"
57
61
 
58
62
  Finally, here are a few examples of LogicTool usage:
59
63
 
@@ -614,6 +614,7 @@ module LogicTools
614
614
  # --
615
615
  # TODO consider the X~X and X+~X cases.
616
616
  def reduce
617
+ # print "reducing #{self}\n"
617
618
  # The operator used for the factors
618
619
  fop = @op == :and ? :or : :and
619
620
  # Gather the terms to sorted nodes
@@ -626,7 +627,8 @@ module LogicTools
626
627
  terms.each_with_index do |term0,i|
627
628
  skipped = false
628
629
  terms.each_with_index do |term1,j|
629
- next if (i==j) # Same term
630
+ next if (term0 == term1) # Same term, duplicates will be
631
+ # removed after
630
632
  # Checks the X~X or X+~X cases.
631
633
  if ( term0.op == :not and term0.child == term1 ) or
632
634
  ( term1.op == :not and term1.child == term0 ) then
@@ -640,8 +642,14 @@ module LogicTools
640
642
  # skipped = true
641
643
  # break
642
644
  # end
643
- if term1.cover?(term0) then
644
- # term1 covers term0 skip term0.
645
+ if term0.op == :and and term1.cover?(term0) then
646
+ # print "#{term1} is covering #{term0}\n"
647
+ # term1 covers term0 skip term0 for AND.
648
+ skipped = true
649
+ # break
650
+ elsif term0.op == :or and term0.cover?(term1) then
651
+ # print "#{term0} is covering #{term1}\n"
652
+ # term0 covers term1 skip term0 for OR.
645
653
  skipped = true
646
654
  # break
647
655
  end
@@ -650,6 +658,7 @@ module LogicTools
650
658
  end
651
659
  # Avoid duplicates
652
660
  nchildren.uniq!
661
+ # print "reduced nchildren=#{nchildren}\n"
653
662
  # Generate the result
654
663
  if (nchildren.size == 1)
655
664
  return nchildren[0]
@@ -687,6 +696,7 @@ module LogicTools
687
696
  ## Creates a new tree where the current node is distributed over +node+
688
697
  # according to the +dop+ operator.
689
698
  def distribute(dop,node) # :nodoc:
699
+ # print "distrubte with self=#{self} and node=#{node}\n"
690
700
  fop = dop == :and ? :or : :and
691
701
  # print "dop=#{dop} fop=#{fop} self.op=#{@op}\n"
692
702
  if (@op == dop) then
@@ -695,6 +705,7 @@ module LogicTools
695
705
  else
696
706
  # self operator if fop
697
707
  if (node.op == fop) then
708
+ # print "(a+b)(c+d) case\n"
698
709
  # node operator is also fop: (a+b)(c+d) or ab+cd case
699
710
  nchildren = []
700
711
  self.each do |child0|
@@ -707,10 +718,12 @@ module LogicTools
707
718
  end
708
719
  return NodeNary.make(fop,*nchildren).flatten
709
720
  else
721
+ # print "(a+b)c case\n"
710
722
  # node operator is not fop: (a+b)c or ab+c case
711
723
  nchildren = self.map do |child|
712
724
  NodeNary.make(dop,child,node).flatten
713
725
  end
726
+ # print "nchildren=#{nchildren}\n"
714
727
  return NodeNary.make(fop,*nchildren).flatten
715
728
  end
716
729
  end
@@ -748,6 +761,7 @@ module LogicTools
748
761
  nchildren = node.map {|child| child.to_sum_product(true) }
749
762
  # Distribute
750
763
  while(nchildren.size>1)
764
+ # print "nchildren=#{nchildren}\n"
751
765
  dist = []
752
766
  nchildren.each_slice(2) do |left,right|
753
767
  if right then
@@ -1,3 +1,3 @@
1
1
  module LogicTools
2
- VERSION = "0.3.0"
2
+ VERSION = "0.3.2"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logic_tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lovic Gauthier