Class: Lernen::Automaton::MooreLike

Inherits:
TransitionSystem show all
Defined in:
lib/lernen/automaton/moore_like.rb

Overview

MooreLike represents a Moore-like transition system.

This transition system has an output value for each configuration (or state). Therefore, the following invariant is required for all conf and input.

step_output, next_conf = self.step(conf, input)
step_output == self.output(next_conf)

Note that in this class, the initial output of the #run method is lost. If it is needed, we can use #run_empty instead.

Note that this class is abstract. We should implement the following method:

  • #type
  • #initial_conf
  • #step_conf(conf, input)
  • #output(conf)

Direct Known Subclasses

DFA, Moore, SPA, VPA

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from TransitionSystem

#initial_conf, random_transition_function, #run, #to_dot, #to_graph, #to_mermaid, #type

Class Method Details

.find_separating_word(alphabet, automaton1, automaton2) ⇒ Object

Finds a separating word between automaton1 and automaton2.

: [Conf, In, Out] ( Array alphabet, MooreLike[Conf, In, Out] automaton1, MooreLike[Conf, In, Out] automaton2 ) -> (Array | nil)



72
73
74
75
76
77
78
79
80
# File 'lib/lernen/automaton/moore_like.rb', line 72

def self.find_separating_word(alphabet, automaton1, automaton2)
  unless automaton2.is_a?(automaton1.class)
    raise ArgumentError, "Cannot find a separating word for different type automata"
  end

  return [] if automaton1.run_empty != automaton2.run_empty # steep:ignore

  super
end

Instance Method Details

#output(conf) ⇒ Object

Returns the output value for the given configuration.

This is an abstract method.

: (Conf conf) -> Out

Raises:



48
49
50
# File 'lib/lernen/automaton/moore_like.rb', line 48

def output(conf)
  raise TypeError, "abstract method: `output`"
end

#run_emptyObject

Runs and returns the output value of the transitions for the empty string.

: () -> Out



63
# File 'lib/lernen/automaton/moore_like.rb', line 63

def run_empty = output(initial_conf)

#step(conf, input) ⇒ Object



55
56
57
58
# File 'lib/lernen/automaton/moore_like.rb', line 55

def step(conf, input)
  next_conf = step_conf(conf, input)
  [output(next_conf), next_conf]
end

#step_conf(conf, input) ⇒ Object

Runs a transition from the given configuration with the given input. It looks like #step, but it does not return an output value because it can be computed by #output in this class.

This is an abstract method.

: (Conf conf, In innput) -> Conf

Raises:



39
40
41
# File 'lib/lernen/automaton/moore_like.rb', line 39

def step_conf(conf, input)
  raise TypeError, "abstract method: `step_conf`"
end