prop_logic 0.2.3 → 0.2.4

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: 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: []