wongi-engine 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- 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
|