automata 0.0.7 → 0.1.0
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 +3 -2
- data/examples/dfa_sample.yml +10 -10
- data/examples/nfa_2.yml +5 -5
- data/lib/automata.rb +13 -1
- data/lib/automata/dfa.rb +7 -7
- data/lib/automata/state_diagram.rb +1 -0
- data/lib/automata/version.rb +1 -1
- metadata +8 -8
data/README.md
CHANGED
@@ -25,6 +25,7 @@ Or install it yourself as:
|
|
25
25
|
### Creating a new machine
|
26
26
|
|
27
27
|
Defining a new machine can be done in two ways:
|
28
|
+
|
28
29
|
* From a structured YAML file.
|
29
30
|
* Through class setter methods.
|
30
31
|
|
@@ -79,7 +80,7 @@ We can define each property of the DFA in a similar manner.
|
|
79
80
|
Now that we've built a machine, we can pass it input and let it work its magic. Consider our DFA built using our `examples/dfa_sample.yml` file, which accepts all strings starting with _00_. Let's experiment with some input:
|
80
81
|
|
81
82
|
# We can make sure it's a valid DFA
|
82
|
-
>> dfa.
|
83
|
+
>> dfa.valid?
|
83
84
|
=> true
|
84
85
|
>> dfa.accepts? '001'
|
85
86
|
=> true
|
@@ -90,7 +91,7 @@ Awesomesauce.
|
|
90
91
|
|
91
92
|
## Special Characters
|
92
93
|
|
93
|
-
* _&_ - Represents an ε-transition (epsilon
|
94
|
+
* _&_ - Represents an ε-transition (epsilon transition)
|
94
95
|
|
95
96
|
## Contributing
|
96
97
|
|
data/examples/dfa_sample.yml
CHANGED
@@ -9,21 +9,21 @@ states:
|
|
9
9
|
- C
|
10
10
|
- D
|
11
11
|
alphabet:
|
12
|
-
-
|
13
|
-
-
|
12
|
+
- 0
|
13
|
+
- 1
|
14
14
|
start: A
|
15
15
|
accept:
|
16
16
|
- C
|
17
17
|
transitions:
|
18
18
|
A:
|
19
|
-
|
20
|
-
|
19
|
+
0: B
|
20
|
+
1: D
|
21
21
|
B:
|
22
|
-
|
23
|
-
|
22
|
+
0: C
|
23
|
+
1: D
|
24
24
|
C:
|
25
|
-
|
26
|
-
|
25
|
+
0: C
|
26
|
+
1: C
|
27
27
|
D:
|
28
|
-
|
29
|
-
|
28
|
+
0: D
|
29
|
+
1: D
|
data/examples/nfa_2.yml
CHANGED
@@ -11,21 +11,21 @@ states:
|
|
11
11
|
- C
|
12
12
|
- D
|
13
13
|
alphabet:
|
14
|
-
-
|
15
|
-
-
|
14
|
+
- 0
|
15
|
+
- 1
|
16
16
|
start: B
|
17
17
|
accept:
|
18
18
|
- A
|
19
19
|
- D
|
20
20
|
transitions:
|
21
21
|
A:
|
22
|
-
|
22
|
+
1: A
|
23
23
|
B:
|
24
24
|
'&':
|
25
25
|
- A
|
26
26
|
- C
|
27
27
|
C:
|
28
|
-
|
28
|
+
0:
|
29
29
|
- C
|
30
30
|
- D
|
31
|
-
|
31
|
+
1: C
|
data/lib/automata.rb
CHANGED
@@ -5,5 +5,17 @@ require "automata/dfa"
|
|
5
5
|
require "automata/nfa"
|
6
6
|
|
7
7
|
module Automata
|
8
|
-
|
8
|
+
|
9
9
|
end
|
10
|
+
|
11
|
+
class Hash
|
12
|
+
# Transforms all keys of a hash to strings.
|
13
|
+
#
|
14
|
+
# @param [Hash] the Hash whose keys to convert.
|
15
|
+
# @return [Hash] the new Hash with strings as keys.
|
16
|
+
def self.keys_to_strings(obj)
|
17
|
+
return obj unless obj.kind_of? Hash
|
18
|
+
obj = obj.inject({}){|h,(k,v)| h[k.to_s] = Hash.keys_to_strings(v); h}
|
19
|
+
return obj
|
20
|
+
end
|
21
|
+
end
|
data/lib/automata/dfa.rb
CHANGED
@@ -11,9 +11,11 @@ module Automata
|
|
11
11
|
# Iterate through each states to verify the graph
|
12
12
|
# is not disjoint.
|
13
13
|
@transitions.each do |key, val|
|
14
|
-
@alphabet.each
|
14
|
+
@alphabet.each do |a|
|
15
|
+
return false unless @transitions[key].has_key? a.to_s
|
16
|
+
end
|
15
17
|
end
|
16
|
-
true
|
18
|
+
return true
|
17
19
|
end
|
18
20
|
|
19
21
|
# Determines whether the DFA accepts a given string.
|
@@ -21,10 +23,8 @@ module Automata
|
|
21
23
|
# @param [String] input the string to use as input for the DFA.
|
22
24
|
# @return [Boolean] whether or not the DFA accepts the string.
|
23
25
|
def accepts?(input)
|
24
|
-
head = @start
|
25
|
-
input.each_char
|
26
|
-
head = @transitions[head][symbol]
|
27
|
-
end
|
26
|
+
head = @start.to_s
|
27
|
+
input.each_char { |symbol| head = @transitions[head][symbol] }
|
28
28
|
is_accept_state? head
|
29
29
|
end
|
30
30
|
|
@@ -33,7 +33,7 @@ module Automata
|
|
33
33
|
# @param [String] state the state label to check.
|
34
34
|
# @return [Boolean] whether or not the state is an accept state.
|
35
35
|
def is_accept_state?(state)
|
36
|
-
@accept.include? state
|
36
|
+
@accept.include? state.to_s
|
37
37
|
end
|
38
38
|
end
|
39
39
|
end
|
data/lib/automata/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: automata
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-04-
|
12
|
+
date: 2012-04-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
16
|
-
requirement: &
|
16
|
+
requirement: &70286071406040 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70286071406040
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rspec
|
27
|
-
requirement: &
|
27
|
+
requirement: &70286071405420 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
version: 2.9.0
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70286071405420
|
36
36
|
description: Create and simulate automaton.
|
37
37
|
email:
|
38
38
|
- jico@baligod.com
|
@@ -72,7 +72,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
72
72
|
version: '0'
|
73
73
|
segments:
|
74
74
|
- 0
|
75
|
-
hash:
|
75
|
+
hash: 3744273630478255702
|
76
76
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
77
77
|
none: false
|
78
78
|
requirements:
|
@@ -81,7 +81,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
81
81
|
version: '0'
|
82
82
|
segments:
|
83
83
|
- 0
|
84
|
-
hash:
|
84
|
+
hash: 3744273630478255702
|
85
85
|
requirements: []
|
86
86
|
rubyforge_project:
|
87
87
|
rubygems_version: 1.8.17
|