package rationals.transformations;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import rationals.Automaton;
import rationals.NoSuchStateException;
import rationals.State;
import rationals.Transition;
/**
* Computes the reversal of an Automaton.
* <p />
* <ul>
* <li>C = A-</li>
* <li>S(C) = S(A)</li>
* <li>S0(C) = T(A)</li>
* <li>T(C) = S0(A)</li>
* <li>D(C) = { (s1,a,s2) | exists (s2,a,s1) in D(A) }</li>
* </ul>
* @author nono
* @version $Id: Reverser.java 2 2006-08-24 14:41:48Z oqube $
*/
public class Reverser implements UnaryTransformation {
public Automaton transform(Automaton a) {
Automaton b = new Automaton() ;
Map map = new HashMap() ;
Iterator i = a.states().iterator() ;
while(i.hasNext()) {
State e = (State) i.next() ;
map.put(e , b.addState(e.isTerminal() , e.isInitial())) ;
}
i = a.delta().iterator() ;
while(i.hasNext()) {
Transition t = (Transition) i.next() ;
try {
b.addTransition(new Transition(
(State) map.get(t.end()) ,
t.label() ,
(State) map.get(t.start()))) ;
} catch(NoSuchStateException x) {}
}
return b ;
}
}