ruleby 0.2 → 0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/benchmarks/basic_rules.rb +66 -0
- data/benchmarks/joined_rules.rb +73 -0
- data/benchmarks/miss_manners/data.rb +11 -0
- data/benchmarks/miss_manners/miss_manners.rb +11 -1
- data/benchmarks/miss_manners/model.rb +11 -0
- data/benchmarks/miss_manners/rules.rb +49 -110
- data/benchmarks/model.rb +36 -0
- data/examples/example_diagnosis.rb +35 -73
- data/examples/example_hello.rb +20 -22
- data/examples/example_politician.rb +22 -11
- data/examples/example_ticket.rb +40 -85
- data/examples/fibonacci_example1.rb +13 -2
- data/examples/fibonacci_example2.rb +11 -0
- data/examples/fibonacci_rulebook.rb +58 -111
- data/examples/test_self_reference.rb +51 -9
- data/lib/core/atoms.rb +53 -116
- data/lib/core/engine.rb +96 -96
- data/lib/core/nodes.rb +330 -298
- data/lib/core/patterns.rb +36 -39
- data/lib/core/utils.rb +141 -3
- data/lib/dsl/ferrari.rb +263 -0
- data/lib/dsl/letigre.rb +212 -0
- data/lib/dsl/steel.rb +313 -0
- data/lib/rulebook.rb +82 -265
- data/lib/ruleby.rb +13 -0
- metadata +21 -19
- data/benchmarks/50_joined_rules.rb +0 -78
- data/benchmarks/50_rules.rb +0 -57
- data/benchmarks/5_joined_rules.rb +0 -78
- data/benchmarks/5_rules.rb +0 -57
data/examples/example_hello.rb
CHANGED
@@ -1,6 +1,18 @@
|
|
1
|
+
# This file is part of the Ruleby project (http://ruleby.org)
|
2
|
+
#
|
3
|
+
# This application is free software; you can redistribute it and/or
|
4
|
+
# modify it under the terms of the Ruby license defined in the
|
5
|
+
# LICENSE.txt file.
|
6
|
+
#
|
7
|
+
# Copyright (c) 2007 Joe Kutner and Matt Smith. All rights reserved.
|
8
|
+
#
|
9
|
+
# * Authors: Joe Kutner, Matt Smith
|
10
|
+
#
|
11
|
+
|
1
12
|
$LOAD_PATH << File.join(File.dirname(__FILE__), '../lib/')
|
2
13
|
require 'ruleby'
|
3
|
-
|
14
|
+
|
15
|
+
include Ruleby
|
4
16
|
|
5
17
|
class Message
|
6
18
|
def initialize(status,message)
|
@@ -13,33 +25,19 @@ end
|
|
13
25
|
|
14
26
|
class HelloWorldRulebook < Rulebook
|
15
27
|
def rules
|
16
|
-
rule
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
r.then = action do |e,vars|
|
22
|
-
puts vars[:m].message
|
23
|
-
e.retract vars[:m]
|
24
|
-
vars[:m].message = "Goodbye world"
|
25
|
-
vars[:m].status = :GOODBYE
|
26
|
-
e.assert vars[:m]
|
27
|
-
end
|
28
|
+
rule [Message, :m, m.status == :HELLO] do |e,v|
|
29
|
+
puts v[:m].message
|
30
|
+
v[:m].message = "Goodbye world"
|
31
|
+
v[:m].status = :GOODBYE
|
32
|
+
e.modify v[:m]
|
28
33
|
end
|
29
34
|
|
30
|
-
rule
|
31
|
-
|
32
|
-
has.m Message
|
33
|
-
has.m.status = :GOODBYE
|
34
|
-
end
|
35
|
-
r.then = action do |e,vars|
|
36
|
-
puts vars[:m].message
|
37
|
-
end
|
35
|
+
rule [Message, :m, m.status == :GOODBYE] do |e,v|
|
36
|
+
puts v[:m].message
|
38
37
|
end
|
39
38
|
end
|
40
39
|
end
|
41
40
|
|
42
|
-
include Ruleby
|
43
41
|
|
44
42
|
engine :engine do |e|
|
45
43
|
HelloWorldRulebook.new(e).rules
|
@@ -1,6 +1,18 @@
|
|
1
|
+
# This file is part of the Ruleby project (http://ruleby.org)
|
2
|
+
#
|
3
|
+
# This application is free software; you can redistribute it and/or
|
4
|
+
# modify it under the terms of the Ruby license defined in the
|
5
|
+
# LICENSE.txt file.
|
6
|
+
#
|
7
|
+
# Copyright (c) 2007 Joe Kutner and Matt Smith. All rights reserved.
|
8
|
+
#
|
9
|
+
# * Authors: Joe Kutner, Matt Smith
|
10
|
+
#
|
11
|
+
|
1
12
|
$LOAD_PATH << File.join(File.dirname(__FILE__), '../lib/')
|
2
13
|
require 'ruleby'
|
3
|
-
|
14
|
+
|
15
|
+
include Ruleby
|
4
16
|
|
5
17
|
class Politician
|
6
18
|
def initialize(name,honest)
|
@@ -16,23 +28,24 @@ end
|
|
16
28
|
class Hope
|
17
29
|
end
|
18
30
|
|
31
|
+
# NOTE this example demonstrates the BlueSteel (block based) DSL syntax
|
19
32
|
class PoliticianRulebook < Rulebook
|
20
|
-
def rules
|
21
|
-
rule
|
33
|
+
def rules
|
34
|
+
rule :We_have_an_honest_Politician do |r|
|
22
35
|
r.when do |has|
|
23
36
|
has.p Politician
|
24
37
|
has.p.honest = true
|
25
38
|
end
|
26
|
-
r.then
|
39
|
+
r.then do |e,vars|
|
27
40
|
e.assert Hope.new
|
28
41
|
end
|
29
42
|
end
|
30
43
|
|
31
|
-
rule
|
44
|
+
rule :Hope_Lives do |r|
|
32
45
|
r.when do |has|
|
33
46
|
has.h Hope
|
34
47
|
end
|
35
|
-
r.then
|
48
|
+
r.then do |e,vars|
|
36
49
|
puts 'Hurrah!!! Democracy Lives'
|
37
50
|
end
|
38
51
|
r.priority = 10
|
@@ -46,20 +59,20 @@ class PoliticianRulebook < Rulebook
|
|
46
59
|
# r.when = pattern do |p|
|
47
60
|
# p.not :h, Hope
|
48
61
|
# end
|
49
|
-
# r.then
|
62
|
+
# r.then 'Hope is Dead' do |r,vars|
|
50
63
|
# puts 'We are all Doomed!!! Democracy is Dead'
|
51
64
|
# end
|
52
65
|
# r.priority = -1
|
53
66
|
# end
|
54
67
|
|
55
|
-
rule
|
68
|
+
rule :Corrupt_the_Honest do |r|
|
56
69
|
r.when do |has|
|
57
70
|
has.p Politician
|
58
71
|
has.p.honest = true
|
59
72
|
|
60
73
|
has.h Hope
|
61
74
|
end
|
62
|
-
r.then
|
75
|
+
r.then do |e,vars|
|
63
76
|
puts 'I am an evil corporation and I have corrupted ' + vars[:p].name
|
64
77
|
vars[:p].honest = false
|
65
78
|
e.modify vars[:p]
|
@@ -69,8 +82,6 @@ class PoliticianRulebook < Rulebook
|
|
69
82
|
end
|
70
83
|
end
|
71
84
|
|
72
|
-
include Ruleby
|
73
|
-
|
74
85
|
p1 = Politician.new('blair', true)
|
75
86
|
p2 = Politician.new('bush', true)
|
76
87
|
p3 = Politician.new('chirac', true)
|
data/examples/example_ticket.rb
CHANGED
@@ -1,11 +1,18 @@
|
|
1
|
+
# This file is part of the Ruleby project (http://ruleby.org)
|
2
|
+
#
|
3
|
+
# This application is free software; you can redistribute it and/or
|
4
|
+
# modify it under the terms of the Ruby license defined in the
|
5
|
+
# LICENSE.txt file.
|
6
|
+
#
|
7
|
+
# Copyright (c) 2007 Joe Kutner and Matt Smith. All rights reserved.
|
8
|
+
#
|
9
|
+
# * Authors: Joe Kutner, Matt Smith
|
10
|
+
#
|
11
|
+
|
1
12
|
$LOAD_PATH << File.join(File.dirname(__FILE__), '../lib/')
|
2
13
|
require 'ruleby'
|
3
|
-
require 'rulebook'
|
4
14
|
|
5
|
-
|
6
|
-
# what the conflict resolution strategy should be. When we implement the
|
7
|
-
# default strategy as we understand it (from various literature) this example
|
8
|
-
# does not work (nor should it). But this example works in drools as is. Why?
|
15
|
+
include Ruleby
|
9
16
|
|
10
17
|
class Customer
|
11
18
|
def initialize(name,subscription)
|
@@ -21,7 +28,7 @@ end
|
|
21
28
|
class Ticket
|
22
29
|
def initialize(customer)
|
23
30
|
@customer = customer
|
24
|
-
@status =
|
31
|
+
@status = :New
|
25
32
|
end
|
26
33
|
attr :status, true
|
27
34
|
attr_reader :customer
|
@@ -31,107 +38,55 @@ class Ticket
|
|
31
38
|
end
|
32
39
|
|
33
40
|
# This example is used in JBoss-Rules to demonstrate durations and the use of
|
34
|
-
# custom DSL. We are simply using here to demonstrate another example.
|
41
|
+
# custom DSL. We are simply using it here to demonstrate another example.
|
35
42
|
class TroubleTicketRulebook < Rulebook
|
36
43
|
def rules
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
end
|
44
|
-
|
45
|
-
r.then = action do |e,vars|
|
44
|
+
|
45
|
+
# This is uses the letigre syntax... but we can mix and match syntaxes in
|
46
|
+
# the same rule set.
|
47
|
+
rule :New_Ticket, {:priority => 10}, # :duration => 10},
|
48
|
+
'Customer as :c',
|
49
|
+
'Ticket as :ticket where #customer == #:c #&& #status == :New' do |e,vars|
|
46
50
|
puts 'New : ' + vars[:ticket].to_s
|
47
|
-
end
|
48
|
-
|
49
|
-
r.priority = 10
|
50
|
-
#r.duration = 10
|
51
51
|
end
|
52
52
|
|
53
|
-
rule
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
has.ticket.customer = :customer, :%
|
60
|
-
has.ticket.status = 'New'
|
61
|
-
end
|
62
|
-
|
63
|
-
r.then = action do |e,vars|
|
64
|
-
vars[:ticket].status = 'Escalate'
|
53
|
+
# Now we are using the ferrari syntax. The rule method can detect which
|
54
|
+
# syntax we are using, and compile accordingly.
|
55
|
+
rule :Silver_Priority, #{:duration => 3000},
|
56
|
+
[Customer, :customer, m.subscription == 'Silver'],
|
57
|
+
[Ticket,:ticket, m.customer == b(:customer), m.status == :New] do |e,vars|
|
58
|
+
vars[:ticket].status = :Escalate
|
65
59
|
e.modify vars[:ticket]
|
66
|
-
end
|
67
|
-
#r.duration = 3000
|
68
60
|
end
|
69
61
|
|
70
|
-
rule
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
has.ticket Ticket
|
76
|
-
has.ticket.customer = :customer, :%
|
77
|
-
has.ticket.status = 'New'
|
78
|
-
end
|
79
|
-
|
80
|
-
r.then = action do |e,vars|
|
81
|
-
vars[:ticket].status = 'Escalate'
|
62
|
+
rule :Gold_Priority, #{:duration => 1000},
|
63
|
+
[Customer, :customer, m.subscription == 'Gold'],
|
64
|
+
[Ticket,:ticket, m.customer == b(:customer), m.status == :New] do |e,vars|
|
65
|
+
vars[:ticket].status = :Escalate
|
82
66
|
e.modify vars[:ticket]
|
83
|
-
end
|
84
|
-
#r.duration = 1000
|
85
67
|
end
|
86
68
|
|
87
|
-
rule
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
has.ticket Ticket
|
93
|
-
has.ticket.customer = :customer, :%
|
94
|
-
has.ticket.status = 'New'
|
95
|
-
end
|
96
|
-
|
97
|
-
r.then = action do |e,vars|
|
98
|
-
vars[:ticket].status = 'Escalate'
|
69
|
+
rule :Platinum_Priority,
|
70
|
+
[Customer, :customer, m.subscription == 'Platinum'],
|
71
|
+
[Ticket,:ticket, m.customer == b(:customer), m.status == :New] do |e,vars|
|
72
|
+
vars[:ticket].status = :Escalate
|
99
73
|
e.modify vars[:ticket]
|
100
|
-
end
|
101
74
|
end
|
102
75
|
|
103
|
-
rule
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
has.ticket Ticket
|
108
|
-
has.ticket.customer = :customer, :%
|
109
|
-
has.ticket.status = 'Escalate'
|
110
|
-
end
|
111
|
-
|
112
|
-
r.then = action do |e,vars|
|
76
|
+
rule :Escalate,
|
77
|
+
'Customer as :c',
|
78
|
+
'Ticket as :ticket where #customer == #:c #&& #status == :Escalate' do |e,vars|
|
113
79
|
puts 'Email : ' + vars[:ticket].to_s
|
114
|
-
end
|
115
80
|
end
|
116
81
|
|
117
|
-
rule
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
has.ticket Ticket
|
122
|
-
has.ticket.customer = :customer, :%
|
123
|
-
has.ticket.status = 'Done'
|
124
|
-
end
|
125
|
-
|
126
|
-
r.then = action do |e,vars|
|
82
|
+
rule :Done,
|
83
|
+
'Customer as :c',
|
84
|
+
'Ticket as :ticket where #customer == #:c #&& #status == :Done' do |e,vars|
|
127
85
|
puts 'Done : ' + vars[:ticket].to_s
|
128
|
-
end
|
129
86
|
end
|
130
87
|
end
|
131
88
|
end
|
132
89
|
|
133
|
-
include Ruleby
|
134
|
-
|
135
90
|
# FACTS
|
136
91
|
|
137
92
|
a = Customer.new('A', 'Gold')
|
@@ -1,3 +1,14 @@
|
|
1
|
+
# This file is part of the Ruleby project (http://ruleby.org)
|
2
|
+
#
|
3
|
+
# This application is free software; you can redistribute it and/or
|
4
|
+
# modify it under the terms of the Ruby license defined in the
|
5
|
+
# LICENSE.txt file.
|
6
|
+
#
|
7
|
+
# Copyright (c) 2007 Joe Kutner and Matt Smith. All rights reserved.
|
8
|
+
#
|
9
|
+
# * Authors: Joe Kutner, Matt Smith
|
10
|
+
#
|
11
|
+
|
1
12
|
$LOAD_PATH << File.join(File.dirname(__FILE__), '../lib/')
|
2
13
|
require 'ruleby'
|
3
14
|
require 'fibonacci_rulebook'
|
@@ -20,11 +31,11 @@ include Ruleby
|
|
20
31
|
# This example is borrowed from the JBoss-Rule project.
|
21
32
|
|
22
33
|
# FACTS
|
23
|
-
fib1 = Fibonacci.new(
|
34
|
+
fib1 = Fibonacci.new(150)
|
24
35
|
|
25
36
|
t1 = Time.new
|
26
37
|
engine :engine do |e|
|
27
|
-
|
38
|
+
FibonacciRulebookFerrari.new(e).rules
|
28
39
|
e.assert fib1
|
29
40
|
e.match
|
30
41
|
end
|
@@ -1,3 +1,14 @@
|
|
1
|
+
# This file is part of the Ruleby project (http://ruleby.org)
|
2
|
+
#
|
3
|
+
# This application is free software; you can redistribute it and/or
|
4
|
+
# modify it under the terms of the Ruby license defined in the
|
5
|
+
# LICENSE.txt file.
|
6
|
+
#
|
7
|
+
# Copyright (c) 2007 Joe Kutner and Matt Smith. All rights reserved.
|
8
|
+
#
|
9
|
+
# * Authors: Joe Kutner, Matt Smith
|
10
|
+
#
|
11
|
+
|
1
12
|
$LOAD_PATH << File.join(File.dirname(__FILE__), '../lib/')
|
2
13
|
require 'ruleby'
|
3
14
|
require 'fibonacci_rulebook'
|
@@ -1,26 +1,27 @@
|
|
1
|
+
# This file is part of the Ruleby project (http://ruleby.org)
|
2
|
+
#
|
3
|
+
# This application is free software; you can redistribute it and/or
|
4
|
+
# modify it under the terms of the Ruby license defined in the
|
5
|
+
# LICENSE.txt file.
|
6
|
+
#
|
7
|
+
# Copyright (c) 2007 Joe Kutner and Matt Smith. All rights reserved.
|
8
|
+
#
|
9
|
+
# * Authors: Joe Kutner, Matt Smith
|
10
|
+
#
|
1
11
|
|
2
|
-
require '
|
12
|
+
require 'ruleby'
|
13
|
+
|
14
|
+
include Ruleby
|
15
|
+
|
16
|
+
# NOTE this example uses the LeTigre DSL syntax. In addition, its semantics are
|
17
|
+
# different from the other classes.
|
3
18
|
class FibonacciRulebook2 < Rulebook
|
4
19
|
MAX_SEQUENCE = 100
|
5
20
|
def rules
|
6
|
-
rule
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
has.f1.value.not = -1
|
11
|
-
has.f1.sequence :s1
|
12
|
-
|
13
|
-
has.f2 Fibonacci
|
14
|
-
has.f2.value.not = -1
|
15
|
-
has.f2.sequence :s2
|
16
|
-
has.f2.sequence :s1 do |s, s1| s == (s1 + 1) end
|
17
|
-
|
18
|
-
has.f3 Fibonacci
|
19
|
-
has.f3.value = -1
|
20
|
-
has.f3.sequence :s2 do |s, s2| s == (s2 + 1) end
|
21
|
-
end
|
22
|
-
|
23
|
-
r.then do |e, vars|
|
21
|
+
rule :Calculate, {:priority => 2 },
|
22
|
+
'Fibonacci as :f1 where #value != -1 #&& #sequence as :s1',
|
23
|
+
'Fibonacci as :f2 where #value != -1 #&& #sequence == #:s1 + 1 as :s2',
|
24
|
+
'Fibonacci as :f3 where #value == -1 #&& #sequence == #:s2 + 1' do |e, vars|
|
24
25
|
e.retract vars[:f1]
|
25
26
|
e.retract vars[:f3]
|
26
27
|
if(vars[:f2].sequence == MAX_SEQUENCE)
|
@@ -29,109 +30,55 @@ class FibonacciRulebook2 < Rulebook
|
|
29
30
|
f3 = Fibonacci.new(vars[:f2].sequence + 1, vars[:f1].value + vars[:f2].value)
|
30
31
|
e.assert f3
|
31
32
|
puts "#{f3.sequence} == #{f3.value}"
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
r.priority = 2
|
33
|
+
end
|
36
34
|
end
|
37
35
|
|
38
|
-
rule
|
39
|
-
|
40
|
-
|
41
|
-
has.f Fibonacci
|
42
|
-
has.f.value.not = -1
|
43
|
-
has.f.sequence :s1
|
44
|
-
|
45
|
-
has.f2 Fibonacci
|
46
|
-
has.f2.value.not = -1
|
47
|
-
has.f2.sequence :s1 do |s, s1| s == (s1 + 1) end
|
48
|
-
end
|
49
|
-
|
50
|
-
r.then do |e, vars|
|
36
|
+
rule :Build, {:priority => 1},
|
37
|
+
'Fibonacci as :f1 where #value != -1 #&& #sequence as :s1',
|
38
|
+
'Fibonacci as :f2 where #value != -1 #&& #sequence == #:s1 + 1' do |e, vars|
|
51
39
|
f3 = Fibonacci.new(vars[:f2].sequence + 1, -1)
|
52
40
|
e.assert f3
|
53
|
-
end
|
54
|
-
|
55
|
-
r.priority = 1
|
56
41
|
end
|
57
42
|
end
|
58
43
|
end
|
59
44
|
|
60
|
-
|
61
|
-
|
45
|
+
# NOTE
|
46
|
+
# In this class we demonstrate the Ferrari DSL syntax.
|
47
|
+
class FibonacciRulebookFerrari < Rulebook
|
62
48
|
def rules
|
63
49
|
# Bootstrap1
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
r.then do |e,vars|
|
72
|
-
vars[:f].value = 1
|
73
|
-
e.modify vars[:f]
|
74
|
-
puts vars[:f].sequence.to_s + ' == ' + vars[:f].value.to_s
|
75
|
-
end
|
76
|
-
|
77
|
-
r.priority = 4
|
78
|
-
end
|
50
|
+
rule :Bootstrap1, {:priority => 4},
|
51
|
+
[Fibonacci, :f, m.value == -1, m.sequence == 1 ] do |e,vars|
|
52
|
+
vars[:f].value = 1
|
53
|
+
e.modify vars[:f]
|
54
|
+
puts vars[:f].sequence.to_s + ' == ' + vars[:f].value.to_s
|
55
|
+
end
|
79
56
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
r.then do |e,vars|
|
88
|
-
f2 = Fibonacci.new(vars[:f].sequence - 1)
|
89
|
-
e.assert f2
|
90
|
-
puts 'recurse for ' + f2.sequence.to_s
|
91
|
-
end
|
92
|
-
r.priority = 3
|
93
|
-
end
|
57
|
+
# Recurse
|
58
|
+
rule :Recurse, {:priority => 3},
|
59
|
+
[Fibonacci, :f, m.value == -1] do |e,vars|
|
60
|
+
f2 = Fibonacci.new(vars[:f].sequence - 1)
|
61
|
+
e.assert f2
|
62
|
+
puts 'recurse for ' + f2.sequence.to_s
|
63
|
+
end
|
94
64
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
r.then do |e,vars|
|
103
|
-
vars[:f9].value = 1
|
104
|
-
e.modify vars[:f9]
|
105
|
-
puts vars[:f9].sequence.to_s + ' == ' + vars[:f9].value.to_s
|
106
|
-
end
|
107
|
-
r.priority = 0
|
108
|
-
end
|
65
|
+
# Bootstrap2
|
66
|
+
rule :Bootstrap2,
|
67
|
+
[Fibonacci, :f, m.value == -1 , m.sequence == 2] do |e,vars|
|
68
|
+
vars[:f].value = 1
|
69
|
+
e.modify vars[:f]
|
70
|
+
puts vars[:f].sequence.to_s + ' == ' + vars[:f].value.to_s
|
71
|
+
end
|
109
72
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
has.f2.sequence :s2
|
120
|
-
has.f2.sequence.references :s1
|
121
|
-
has.f2.sequence do |s2, s1| s2 == (s1 + 1) end
|
122
|
-
|
123
|
-
has.f3 Fibonacci
|
124
|
-
has.f3.value = -1
|
125
|
-
has.f3.sequence.references :s2
|
126
|
-
has.f3.sequence do |sequence, s2| sequence == (s2 + 1) end
|
73
|
+
# Calculate
|
74
|
+
rule :Calculate,
|
75
|
+
[Fibonacci,:f1, m.value.not== -1, {m.sequence => :s1}],
|
76
|
+
[Fibonacci,:f2, m.value.not== -1, {m.sequence( :s1, &c{ |s2,s1| s2 == s1 + 1 } ) => :s2}],
|
77
|
+
[Fibonacci,:f3, m.value == -1, m.sequence(:s2, &c{ |s3,s2| s3 == s2 + 1 }) ] do |e,vars|
|
78
|
+
vars[:f3].value = vars[:f1].value + vars[:f2].value
|
79
|
+
e.modify vars[:f3]
|
80
|
+
e.retract vars[:f1]
|
81
|
+
puts vars[:f3].sequence.to_s + ' == ' + vars[:f3].value.to_s
|
127
82
|
end
|
128
|
-
|
129
|
-
|
130
|
-
e.modify vars[:f3]
|
131
|
-
e.retract vars[:f1]
|
132
|
-
puts vars[:f3].sequence.to_s + ' == ' + vars[:f3].value.to_s
|
133
|
-
end
|
134
|
-
r.priority = 0
|
135
|
-
end
|
136
|
-
end
|
137
|
-
end
|
83
|
+
end
|
84
|
+
end
|