wongi-engine 0.0.5 → 0.0.6
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.
- data/README.md +8 -0
- data/lib/wongi-engine/alpha_memory.rb +10 -2
- data/lib/wongi-engine/beta/join_node.rb +1 -1
- data/lib/wongi-engine/network.rb +1 -2
- data/lib/wongi-engine/version.rb +1 -1
- data/lib/wongi-engine/wme.rb +6 -0
- data/spec/bug_specs/issue_4_spec.rb +94 -0
- metadata +4 -2
data/README.md
CHANGED
@@ -411,6 +411,14 @@ The Rete implementation in this library largely follows the outline presented in
|
|
411
411
|
|
412
412
|
## Changelog
|
413
413
|
|
414
|
+
### 0.0.6
|
415
|
+
|
416
|
+
* fixed a bug caused by retracting facts from within a rule action (#4)
|
417
|
+
|
418
|
+
### 0.0.5
|
419
|
+
|
420
|
+
* fixed a bug with multiple `assert` tests following the same node (#2)
|
421
|
+
|
414
422
|
### 0.0.4
|
415
423
|
|
416
424
|
* reintegrated RDF support
|
@@ -2,7 +2,7 @@ module Wongi::Engine
|
|
2
2
|
|
3
3
|
class AlphaMemory
|
4
4
|
|
5
|
-
attr_reader :betas, :template, :rete
|
5
|
+
attr_reader :betas, :template, :rete
|
6
6
|
|
7
7
|
def initialize template, rete = nil
|
8
8
|
@template = template
|
@@ -34,13 +34,21 @@ module Wongi::Engine
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def inspect
|
37
|
-
"<Alpha #{__id__} template=#{template} wmes=#{wmes}>"
|
37
|
+
"<Alpha #{__id__} template=#{template} wmes=#{@wmes}>"
|
38
38
|
end
|
39
39
|
|
40
40
|
def to_s
|
41
41
|
inspect
|
42
42
|
end
|
43
43
|
|
44
|
+
def wmes
|
45
|
+
Enumerator.new do |y|
|
46
|
+
@wmes.dup.each do |wme|
|
47
|
+
y << wme unless wme.deleted?
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
44
52
|
end
|
45
53
|
|
46
54
|
end
|
@@ -72,7 +72,7 @@ module Wongi
|
|
72
72
|
|
73
73
|
def beta_activate token
|
74
74
|
ws = ' ' * depth
|
75
|
-
self.alpha.wmes.
|
75
|
+
self.alpha.wmes.each do |wme|
|
76
76
|
collected = collect_assignments( wme )
|
77
77
|
if matches?( token, wme ) && passes_filters?( token, wme, collected )
|
78
78
|
propagate_activation token, wme, collected
|
data/lib/wongi-engine/network.rb
CHANGED
@@ -393,14 +393,13 @@ module Wongi::Engine
|
|
393
393
|
end
|
394
394
|
|
395
395
|
def best_alpha template
|
396
|
-
raise
|
397
396
|
candidates = alpha_hash.values.select do |alpha|
|
398
397
|
template =~ alpha.template
|
399
398
|
end
|
400
399
|
result = candidates.inject do |best, alpha|
|
401
400
|
if best.nil?
|
402
401
|
alpha
|
403
|
-
elsif alpha.wmes.length < best.wmes.length
|
402
|
+
elsif alpha.wmes.to_a.length < best.wmes.to_a.length
|
404
403
|
alpha
|
405
404
|
else
|
406
405
|
best
|
data/lib/wongi-engine/version.rb
CHANGED
data/lib/wongi-engine/wme.rb
CHANGED
@@ -9,6 +9,7 @@ module Wongi::Engine
|
|
9
9
|
|
10
10
|
def initialize s, p, o, r = nil
|
11
11
|
|
12
|
+
@deleted = false
|
12
13
|
@alphas = []
|
13
14
|
@tokens = []
|
14
15
|
@generating_tokens = []
|
@@ -53,8 +54,13 @@ module Wongi::Engine
|
|
53
54
|
!manual?
|
54
55
|
end
|
55
56
|
|
57
|
+
def deleted?
|
58
|
+
@deleted
|
59
|
+
end
|
60
|
+
|
56
61
|
def destroy
|
57
62
|
|
63
|
+
@deleted = true
|
58
64
|
alphas.each { |alpha| alpha.remove self }.clear
|
59
65
|
while tokens.first
|
60
66
|
tokens.first.delete # => will remove itself from the array
|
@@ -0,0 +1,94 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "issue 4" do
|
4
|
+
|
5
|
+
it "should correctly retract pre-added items from within a rule" do
|
6
|
+
|
7
|
+
engine = Wongi::Engine.create
|
8
|
+
|
9
|
+
10.times{ |i| engine << [i, :is_number, true] }
|
10
|
+
|
11
|
+
engine.rule 'segregate' do
|
12
|
+
forall {
|
13
|
+
has :Number, :is_number, true
|
14
|
+
}
|
15
|
+
make {
|
16
|
+
action { |token|
|
17
|
+
number = token[:Number]
|
18
|
+
engine << [number, :is_even, true]
|
19
|
+
engine.retract [number, :is_number, true]
|
20
|
+
}
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
numbers = engine.select :_, :is_number, true
|
25
|
+
evens = engine.select :_, :is_even, true
|
26
|
+
|
27
|
+
numbers.should be_empty
|
28
|
+
evens.should have(10).items
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should correctly retract post-added items from within a rule" do
|
33
|
+
|
34
|
+
engine = Wongi::Engine.create
|
35
|
+
|
36
|
+
engine.rule 'segregate' do
|
37
|
+
forall {
|
38
|
+
has :Number, :is_number, true
|
39
|
+
}
|
40
|
+
make {
|
41
|
+
action { |token|
|
42
|
+
number = token[:Number]
|
43
|
+
engine << [number, :is_even, true]
|
44
|
+
engine.retract [number, :is_number, true]
|
45
|
+
}
|
46
|
+
}
|
47
|
+
end
|
48
|
+
|
49
|
+
10.times{ |i| engine << [i, :is_number, true] }
|
50
|
+
|
51
|
+
numbers = engine.select :_, :is_number, true
|
52
|
+
evens = engine.select :_, :is_even, true
|
53
|
+
|
54
|
+
numbers.should be_empty
|
55
|
+
evens.should have(10).items
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should correctly retract later items from within a rule" do
|
60
|
+
|
61
|
+
engine = Wongi::Engine.create
|
62
|
+
|
63
|
+
10.times{ |i| engine << [i, :is_number, true] }
|
64
|
+
|
65
|
+
engine.rule 'segregate' do
|
66
|
+
forall {
|
67
|
+
has :Number, :is_number, true
|
68
|
+
}
|
69
|
+
make {
|
70
|
+
action { |token|
|
71
|
+
number = token[:Number]
|
72
|
+
if number % 2 == 0
|
73
|
+
engine << [number, :is_even, true]
|
74
|
+
engine.retract [number, :is_number, true]
|
75
|
+
engine.retract [number + 1, :is_number, true]
|
76
|
+
else
|
77
|
+
# this should never be reached
|
78
|
+
engine << [number, :is_odd, true]
|
79
|
+
end
|
80
|
+
}
|
81
|
+
}
|
82
|
+
end
|
83
|
+
|
84
|
+
numbers = engine.select :_, :is_number, true
|
85
|
+
evens = engine.select :_, :is_even, true
|
86
|
+
odds = engine.select :_, :is_odd, true
|
87
|
+
|
88
|
+
numbers.should be_empty
|
89
|
+
evens.should have(5).items
|
90
|
+
odds.should be_empty
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wongi-engine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-01-24 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: A rule engine.
|
15
15
|
email:
|
@@ -76,6 +76,7 @@ files:
|
|
76
76
|
- lib/wongi-engine/version.rb
|
77
77
|
- lib/wongi-engine/wme.rb
|
78
78
|
- lib/wongi-engine/wme_match_data.rb
|
79
|
+
- spec/bug_specs/issue_4_spec.rb
|
79
80
|
- spec/dataset_spec.rb
|
80
81
|
- spec/dsl_spec.rb
|
81
82
|
- spec/filter_specs/assert_test_spec.rb
|
@@ -114,6 +115,7 @@ signing_key:
|
|
114
115
|
specification_version: 3
|
115
116
|
summary: A rule engine.
|
116
117
|
test_files:
|
118
|
+
- spec/bug_specs/issue_4_spec.rb
|
117
119
|
- spec/dataset_spec.rb
|
118
120
|
- spec/dsl_spec.rb
|
119
121
|
- spec/filter_specs/assert_test_spec.rb
|