logic_tools 0.3.5 → 0.3.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/logic_tools/complement.rb +47 -0
- data/lib/logic_tools/logiccover.rb +1 -1
- data/lib/logic_tools/logicfunction.rb +101 -0
- data/lib/logic_tools/logictree.rb +9 -7
- data/lib/logic_tools/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3fac599575ddf5395c3a3e1517361807b16f0de4
|
4
|
+
data.tar.gz: 29be7313218a9c3207222d23c99e7496e4c03a1c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7c36a7c2a6af3d8634dc7d9bbc51ac9dc65370b059888833df4950b1eee5104f0c7e2891a8bbe4eb117d9f2dc563c4a2d2687f4ba60d0feeff5d2171b53551c0
|
7
|
+
data.tar.gz: 5d7d3e6d2a5fb7c7b5ac1d1162906fdb7ca09f4c067b563ac1d11646b8df9928e86d7cbf416a491378e406e35646b0e66c2d34cbd8143d025bf3cb8ba2fff91c
|
@@ -0,0 +1,47 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#########################################################################
|
3
|
+
# Computes (quickly) the complement of a logic expression #
|
4
|
+
#########################################################################
|
5
|
+
|
6
|
+
|
7
|
+
# For building logic trees
|
8
|
+
require "logic_tools/logictree.rb"
|
9
|
+
|
10
|
+
# For parsing the inputs
|
11
|
+
require "logic_tools/logicparse.rb"
|
12
|
+
|
13
|
+
# For converting the inputs to covers.
|
14
|
+
require "logic_tools/logicconvert.rb"
|
15
|
+
|
16
|
+
# For processing the cover (and therfore check tautology)
|
17
|
+
require "logic_tools/logiccover.rb"
|
18
|
+
|
19
|
+
# For the command line interface
|
20
|
+
require "logic_tools/logicinput.rb"
|
21
|
+
|
22
|
+
include LogicTools
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
|
28
|
+
############################
|
29
|
+
# The main program
|
30
|
+
|
31
|
+
# Iterrate on each expression
|
32
|
+
each_input do |expr|
|
33
|
+
# Parse the expression.
|
34
|
+
parsed = string2logic(expr)
|
35
|
+
# print "parsed=#{parsed}\n"
|
36
|
+
|
37
|
+
# Convert it to a cover.
|
38
|
+
cover = parsed.to_cover
|
39
|
+
# print "cover=#{cover}\n"
|
40
|
+
|
41
|
+
# Computes the complement
|
42
|
+
complement = cover.complement
|
43
|
+
# print "complement=#{complement}\n"
|
44
|
+
|
45
|
+
# Display the result
|
46
|
+
print complement.to_tree, "\n"
|
47
|
+
end
|
@@ -13,7 +13,7 @@ module LogicTools
|
|
13
13
|
# NOTE: cubes are crutial for the performance of the implementation
|
14
14
|
# of the simplifying algorithm.
|
15
15
|
# Hence they are internally represented as strings, since they are
|
16
|
-
# much more
|
16
|
+
# much more memory efficient and usually faster than arrays.
|
17
17
|
#
|
18
18
|
# Then there are two interfaces:
|
19
19
|
# * The standard interface is based on strings and substrings only and
|
@@ -0,0 +1,101 @@
|
|
1
|
+
##############################################################
|
2
|
+
# Logic function class: used for describing a logic function #
|
3
|
+
##############################################################
|
4
|
+
|
5
|
+
|
6
|
+
require "logic_tools/logictree.rb"
|
7
|
+
|
8
|
+
|
9
|
+
module LogicTools
|
10
|
+
|
11
|
+
|
12
|
+
##
|
13
|
+
# Represents a logic function.
|
14
|
+
#
|
15
|
+
# A logic function is described as a set of logic trees (LogicTools::Node)
|
16
|
+
# associated to variables (LogicTools::Variable) repreenting each one
|
17
|
+
# one-bit output. The inputs are represented by the variables contained
|
18
|
+
# by the variable nodes (LogicTools::NodeVar) of the trees.
|
19
|
+
#
|
20
|
+
# Functions can be composed together through their variables.
|
21
|
+
class Function
|
22
|
+
|
23
|
+
## Creates a new empty function.
|
24
|
+
def initialize
|
25
|
+
@assigns = {}
|
26
|
+
end
|
27
|
+
|
28
|
+
## duplicates the function.
|
29
|
+
def clone # :nodoc:
|
30
|
+
result = Function.new
|
31
|
+
@assigns.each { |output,tree| result.add(output,tree.clone) }
|
32
|
+
return result
|
33
|
+
end
|
34
|
+
alias dup clone
|
35
|
+
|
36
|
+
## Adds an +output+ variable associated with a +tree+ for computing it.
|
37
|
+
def add(output,tree)
|
38
|
+
unless tree.is_a?(Node)
|
39
|
+
raise "Invalid class for a logic tree: #{tree.class}"
|
40
|
+
end
|
41
|
+
@assigns[Variable.get(output)] = tree
|
42
|
+
end
|
43
|
+
alias []= add
|
44
|
+
|
45
|
+
## Gets the tree corresponding to an +output+ variable.
|
46
|
+
def get(output)
|
47
|
+
return @assigns[Variable.get(variable)]
|
48
|
+
end
|
49
|
+
alias [] get
|
50
|
+
|
51
|
+
## Iterates over the assignments of the functions.
|
52
|
+
def each(&blk)
|
53
|
+
# No block given? Return an enumerator.
|
54
|
+
return to_enum(:each) unless block_given?
|
55
|
+
|
56
|
+
# Block given? Apply it.
|
57
|
+
@assigns.each(&blk)
|
58
|
+
end
|
59
|
+
|
60
|
+
## Iterates over the output variables of the function.
|
61
|
+
def each_output(&blk)
|
62
|
+
# No block given? Return an enumerator.
|
63
|
+
return to_enum(:each_output) unless block_given?
|
64
|
+
|
65
|
+
# Block given? Apply it.
|
66
|
+
@assigns.each_key(&blk)
|
67
|
+
end
|
68
|
+
|
69
|
+
## Gets a array containing the variables of the function sorted by name.
|
70
|
+
def get_variables
|
71
|
+
result = @assigns.each_value.reduce([]) do |ar,tree|
|
72
|
+
ar.concat(tree.get_variables)
|
73
|
+
end
|
74
|
+
result.uniq!.sort!
|
75
|
+
return result
|
76
|
+
end
|
77
|
+
|
78
|
+
## Iterates over the trees of the function.
|
79
|
+
def each_tree(&blk)
|
80
|
+
# No block given? Return an enumerator.
|
81
|
+
return to_enum(:each_tree) unless block_given?
|
82
|
+
|
83
|
+
# Block given? Apply it.
|
84
|
+
@assigns.each_value(&blk)
|
85
|
+
end
|
86
|
+
|
87
|
+
## Convert to a string.
|
88
|
+
def to_s # :nodoc:
|
89
|
+
result = @assigns.each.reduce("[") do |str,assign|
|
90
|
+
str << assign[0].to_s
|
91
|
+
str << "="
|
92
|
+
str << assign[1].to_s
|
93
|
+
str << ","
|
94
|
+
end
|
95
|
+
result[-1] = "]"
|
96
|
+
return result
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
@@ -76,6 +76,8 @@ module LogicTools
|
|
76
76
|
|
77
77
|
include Enumerable
|
78
78
|
|
79
|
+
alias dup clone
|
80
|
+
|
79
81
|
## Gets a array containing the variables of the tree sorted by name.
|
80
82
|
def get_variables()
|
81
83
|
result = self.get_variablesRecurse
|
@@ -741,8 +743,8 @@ module LogicTools
|
|
741
743
|
end
|
742
744
|
|
743
745
|
## Duplicates the node.
|
744
|
-
def
|
745
|
-
return NodeAnd.new(*@children.map(&:
|
746
|
+
def clone # :nodoc:
|
747
|
+
return NodeAnd.new(*@children.map(&:clone))
|
746
748
|
end
|
747
749
|
|
748
750
|
## Computes the value of the node.
|
@@ -781,7 +783,7 @@ module LogicTools
|
|
781
783
|
end
|
782
784
|
end
|
783
785
|
|
784
|
-
##
|
786
|
+
## Converts to a string.
|
785
787
|
def to_s # :nodoc:
|
786
788
|
return @str if @str
|
787
789
|
@str = ""
|
@@ -809,8 +811,8 @@ module LogicTools
|
|
809
811
|
end
|
810
812
|
|
811
813
|
## Duplicates the node.
|
812
|
-
def
|
813
|
-
return NodeOr.new(*@children.map(&:
|
814
|
+
def clone # :nodoc:
|
815
|
+
return NodeOr.new(*@children.map(&:clone))
|
814
816
|
end
|
815
817
|
|
816
818
|
## Computes the value of the node.
|
@@ -922,8 +924,8 @@ module LogicTools
|
|
922
924
|
end
|
923
925
|
|
924
926
|
## Duplicates the node.
|
925
|
-
def
|
926
|
-
return NodeNot.new(@child.
|
927
|
+
def clone # :nodoc:
|
928
|
+
return NodeNot.new(@child.clone)
|
927
929
|
end
|
928
930
|
|
929
931
|
## Computes the value of the node.
|
data/lib/logic_tools/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logic_tools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lovic Gauthier
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-01-
|
11
|
+
date: 2017-01-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -102,9 +102,11 @@ files:
|
|
102
102
|
- exe/std_dij
|
103
103
|
- exe/truth_tbl
|
104
104
|
- lib/logic_tools.rb
|
105
|
+
- lib/logic_tools/complement.rb
|
105
106
|
- lib/logic_tools/is_tautology.rb
|
106
107
|
- lib/logic_tools/logicconvert.rb
|
107
108
|
- lib/logic_tools/logiccover.rb
|
109
|
+
- lib/logic_tools/logicfunction.rb
|
108
110
|
- lib/logic_tools/logicgenerator.rb
|
109
111
|
- lib/logic_tools/logicinput.rb
|
110
112
|
- lib/logic_tools/logicparse.rb
|