prop_logic 0.2.3 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1dfd97019313a0cf9368c49fc535084abe18637b
4
- data.tar.gz: 2679c35cd7dbf22235bd92b670077c3f57a64e98
3
+ metadata.gz: a458a1f8cc633e600ce0b2e39d591dcae2455932
4
+ data.tar.gz: a83d16bf8e6cbc6025b4f940e1ef3b7dab93e308
5
5
  SHA512:
6
- metadata.gz: 78b0d8ad6a92ec447534f42eb6a6ceee63778f74a7d4466079f9f35f0efe2824e26421b8b0000a98473f9209147956381ff4e8a1de753d964c2d895f14017c3a
7
- data.tar.gz: d6c09dce76e172d687c5420b5aa4847ec789282fc40b5daf9f775cfbbf3410bca8723ea0ca549bc55df6aff0f0da3adbb3c1d00f15031a3cad889d4414bd5cae
6
+ metadata.gz: e71e1608080cad1e400d6a278153544b6619c62694e1de5efc66946277f8452bf84e4879b69996d1098bee792eef5294a31ff0712b23e9424c3cb9e295d130f5
7
+ data.tar.gz: 6b3689179f39190f23787936f05e86cddead26c3f96a62738b0c7072464ed52ad7bdbacb32f793e15a477d4dc842f46f20c33ff558d2a9189af3288ab96247b8
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ # Ver. 0.2.4 (2016/04/09)
2
+ - Using Scrutinizer for code quality
3
+ - Performance improvements
4
+
1
5
  # Ver. 0.2.3 (2016/04/06)
2
6
  - Inprove performance in negating variables
3
7
  - Optionally select normal Hash for caching
data/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # PropLogic
2
2
 
3
3
  [![Build Status](https://travis-ci.org/jkr2255/prop_logic.svg?branch=master)](https://travis-ci.org/jkr2255/prop_logic)
4
+ [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/jkr2255/prop_logic/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/jkr2255/prop_logic/?branch=master)
5
+ [![Code Coverage](https://scrutinizer-ci.com/g/jkr2255/prop_logic/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/jkr2255/prop_logic/?branch=master)
4
6
  [![Gem Version](https://badge.fury.io/rb/prop_logic.svg)](https://badge.fury.io/rb/prop_logic)
5
7
 
6
8
  PropLogic implements propositional logic in Ruby, usable like normal variables.
@@ -1,30 +1,8 @@
1
1
  module PropLogic
2
2
  class AndTerm < Term
3
3
  def initialize(*terms)
4
- @terms = terms.map{|t| t.is_a?(AndTerm) ? t.terms : t}.flatten.freeze
5
- @is_nnf = @terms.all?(&:nnf?)
6
- # term with negative terms are no longer terated as reduced
7
- @is_reduced = @is_nnf && @terms.all? do |term|
8
- if term.is_a?(Constant) || !term.reduced?
9
- false
10
- elsif !(term.is_a?(NotTerm))
11
- true
12
- else
13
- # NotTerm
14
- term.terms[0].is_a?(Variable)
15
- end
16
- end
17
- return unless @is_reduced
18
- # check duplication of terms
19
- if @terms.length != @terms.uniq.length
20
- @is_reduced = false
21
- return
22
- end
23
- # check contradicted variables (mark as unreduced)
24
- # Negated terms (except variables) doesn't come here
25
- not_terms = @terms.select{ |t| t.is_a?(NotTerm) }
26
- negated_variales = not_terms.map{|t| t.terms[0]}
27
- @is_reduced = false unless (negated_variales & @terms).empty?
4
+ @terms = terms.map { |t| t.is_a?(AndTerm) ? t.terms : t }.flatten.freeze
5
+ check_nnf_reduced
28
6
  end
29
7
 
30
8
  def to_s(in_term = false)
@@ -2,6 +2,8 @@ module PropLogic
2
2
  class NotTerm < Term
3
3
  def initialize(term)
4
4
  @terms = [term].freeze
5
+ @is_nnf = @terms[0].is_a?(Variable)
6
+ @is_reduced = @is_nnf && ! (@terms[0].is_a?(Constant))
5
7
  end
6
8
 
7
9
  def to_s(*)
@@ -9,7 +11,7 @@ module PropLogic
9
11
  end
10
12
 
11
13
  def nnf?
12
- @terms[0].is_a?(Variable)
14
+ @is_nnf
13
15
  end
14
16
 
15
17
  def to_nnf
@@ -29,7 +31,7 @@ module PropLogic
29
31
  end
30
32
 
31
33
  def reduced?
32
- nnf? && ! (@terms[0].is_a?(Constant))
34
+ @is_reduced
33
35
  end
34
36
 
35
37
  def reduce
@@ -2,28 +2,7 @@ module PropLogic
2
2
  class OrTerm < Term
3
3
  def initialize(*terms)
4
4
  @terms = terms.map{|t| t.is_a?(OrTerm) ? t.terms : t}.flatten.freeze
5
- @is_nnf = @terms.all?(&:nnf?)
6
- @is_reduced = @is_nnf && @terms.all? do |term|
7
- if term.is_a?(Constant) || !(term.reduced?)
8
- false
9
- elsif !(term.is_a?(NotTerm))
10
- true
11
- else
12
- # NotTerm
13
- term.terms[0].is_a?(Variable)
14
- end
15
- end
16
- return unless @is_reduced
17
- # check duplication of terms
18
- if @terms.length != @terms.uniq.length
19
- @is_reduced = false
20
- return
21
- end
22
- # check obvious variables (mark as unreduced)
23
- # Negated terms (except variables) doesn't come here
24
- not_terms = @terms.select{ |t| t.is_a?(NotTerm) }
25
- negated_variales = not_terms.map{|t| t.terms[0]}
26
- @is_reduced = false unless (negated_variales & @terms).empty?
5
+ check_nnf_reduced
27
6
  end
28
7
 
29
8
  def to_s(in_term = false)
@@ -189,5 +189,34 @@ module PropLogic
189
189
  ((self | other) & (~self | ~other)).unsat?
190
190
  end
191
191
 
192
+ private
193
+
194
+ # checking methods
195
+
196
+ def check_term_uniqueness
197
+ @is_reduced &&= (@terms.length == @terms.uniq.length)
198
+ end
199
+
200
+ def check_ambivalent_vars
201
+ return unless @is_reduced
202
+ term_by_class = @terms.group_by(&:class)
203
+ return if term_by_class[NotTerm].nil? || term_by_class[Variable].nil?
204
+ negated_variales = term_by_class[NotTerm].map { |t| t.terms[0] }
205
+ @is_reduced = false unless (negated_variales & term_by_class[Variable]).empty?
206
+ end
207
+
208
+ def check_nnf_reduced
209
+ @is_reduced = true
210
+ @is_nnf = @terms.all? do |term|
211
+ @is_reduced &&= !term.is_a?(Constant) && term.reduced?
212
+ @is_reduced &&= !term.is_a?(NotTerm) || term.terms[0].is_a?(Variable)
213
+ next true if @is_reduced
214
+ term.nnf?
215
+ end
216
+ return unless @is_reduced
217
+ check_term_uniqueness
218
+ check_ambivalent_vars
219
+ end
220
+
192
221
  end
193
222
  end
@@ -1,3 +1,3 @@
1
1
  module PropLogic
2
- VERSION = '0.2.3'
2
+ VERSION = '0.2.4'
3
3
  end
data/prop_logic.gemspec CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.bindir = "exe"
20
20
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
21
  spec.require_paths = ["lib"]
22
-
22
+
23
23
  spec.add_dependency "ref", '~> 2.0'
24
24
  spec.required_ruby_version = '>= 2.0.0'
25
25
 
@@ -27,5 +27,5 @@ Gem::Specification.new do |spec|
27
27
  spec.add_development_dependency "bundler", "~> 1.7"
28
28
  spec.add_development_dependency "rake", "~> 10.0"
29
29
  spec.add_development_dependency "rspec", '~> 3.0'
30
- # spec.add_development_dependency "pry-byebug", '~> 3.3'
30
+ spec.add_development_dependency "scrutinizer-ocular", '~> 1.0'
31
31
  end
metadata CHANGED
@@ -1,71 +1,85 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: prop_logic
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jkr2255
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-04-06 00:00:00.000000000 Z
11
+ date: 2016-04-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
+ name: ref
14
15
  requirement: !ruby/object:Gem::Requirement
15
16
  requirements:
16
17
  - - "~>"
17
18
  - !ruby/object:Gem::Version
18
19
  version: '2.0'
19
- name: ref
20
- prerelease: false
21
20
  type: :runtime
21
+ prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.0'
27
27
  - !ruby/object:Gem::Dependency
28
+ name: bundler
28
29
  requirement: !ruby/object:Gem::Requirement
29
30
  requirements:
30
31
  - - "~>"
31
32
  - !ruby/object:Gem::Version
32
33
  version: '1.7'
33
- name: bundler
34
- prerelease: false
35
34
  type: :development
35
+ prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '1.7'
41
41
  - !ruby/object:Gem::Dependency
42
+ name: rake
42
43
  requirement: !ruby/object:Gem::Requirement
43
44
  requirements:
44
45
  - - "~>"
45
46
  - !ruby/object:Gem::Version
46
47
  version: '10.0'
47
- name: rake
48
- prerelease: false
49
48
  type: :development
49
+ prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '10.0'
55
55
  - !ruby/object:Gem::Dependency
56
+ name: rspec
56
57
  requirement: !ruby/object:Gem::Requirement
57
58
  requirements:
58
59
  - - "~>"
59
60
  - !ruby/object:Gem::Version
60
61
  version: '3.0'
61
- name: rspec
62
- prerelease: false
63
62
  type: :development
63
+ prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '3.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: scrutinizer-ocular
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.0'
69
83
  description: Write propositional logic formulae using Ruby DSL.
70
84
  email:
71
85
  - magnesium.oxide.play@gmail.com
@@ -102,7 +116,7 @@ homepage: https://github.com/jkr2255/prop_logic
102
116
  licenses:
103
117
  - MIT
104
118
  metadata: {}
105
- post_install_message:
119
+ post_install_message:
106
120
  rdoc_options: []
107
121
  require_paths:
108
122
  - lib
@@ -117,9 +131,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
117
131
  - !ruby/object:Gem::Version
118
132
  version: '0'
119
133
  requirements: []
120
- rubyforge_project:
121
- rubygems_version: 2.4.8
122
- signing_key:
134
+ rubyforge_project:
135
+ rubygems_version: 2.4.5.1
136
+ signing_key:
123
137
  specification_version: 4
124
138
  summary: Propositional logic for Ruby
125
139
  test_files: []