001/* Copyright (C) 2013 TU Dortmund
002 * This file is part of AutomataLib, http://www.automatalib.net/.
003 * 
004 * AutomataLib is free software; you can redistribute it and/or
005 * modify it under the terms of the GNU Lesser General Public
006 * License version 3.0 as published by the Free Software Foundation.
007 * 
008 * AutomataLib is distributed in the hope that it will be useful,
009 * but WITHOUT ANY WARRANTY; without even the implied warranty of
010 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
011 * Lesser General Public License for more details.
012 * 
013 * You should have received a copy of the GNU Lesser General Public
014 * License along with AutomataLib; if not, see
015 * <http://www.gnu.de/documents/lgpl.en.html>.
016 */
017
018package de.learnlib.examples.mealy;
019
020import net.automatalib.automata.transout.MealyMachine;
021import net.automatalib.automata.transout.MutableMealyMachine;
022import net.automatalib.automata.transout.impl.compact.CompactMealy;
023import net.automatalib.words.Alphabet;
024import net.automatalib.words.impl.FastAlphabet;
025import net.automatalib.words.impl.Symbol;
026
027/**
028 * This example represents the Coffee Machine example from
029 * Steffen et al. "Introduction to Active Automata Learning from
030 * a Practical Perspective" (Figure 3)
031 * 
032 * @author Maik Merten <maikmerten@googlemail.com>
033 */
034public class ExampleCoffeeMachine {
035        
036        private static final class InstanceHolder {
037                public static final MealyMachine<?,Symbol,?,String> INSTANCE;
038                
039                static {
040                        INSTANCE = constructMachine();
041                }
042        }
043        
044        
045        public final static Symbol in_water = new Symbol("water");
046        public final static Symbol in_pod = new Symbol("pod");
047        public final static Symbol in_button = new Symbol("button");
048        public final static Symbol in_clean = new Symbol("clean");
049        
050        public final static String out_ok = "ok";
051        public final static String out_error = "error";
052        public final static String out_coffee = "coffee!";
053        
054        private final static Alphabet<Symbol> ALPHABET = new FastAlphabet<>(in_water, in_pod, in_button, in_clean);
055        
056        
057        public static Alphabet<Symbol> getInputAlphabet() {
058                return ALPHABET;
059        }
060        
061        public static MealyMachine<?,Symbol,?,String> getInstance() {
062                return InstanceHolder.INSTANCE;
063        }
064        
065        
066    /**
067     * Construct and return a machine representation of this example
068     * 
069     * @return a Mealy machine representing the coffee machine example
070     */   
071    public static <S,A extends MutableMealyMachine<S,Symbol,?,String>>
072    A constructMachine(A machine) {
073                
074                S a = machine.addInitialState(),
075                                b = machine.addState(),
076                                c = machine.addState(),
077                                d = machine.addState(),
078                                e = machine.addState(),
079                                f = machine.addState();
080                
081                machine.addTransition(a, in_water, c, out_ok);
082                machine.addTransition(a, in_pod, b, out_ok);
083                machine.addTransition(a, in_button, f, out_error);
084                machine.addTransition(a, in_clean, a, out_ok);
085
086                machine.addTransition(b, in_water, d, out_ok);
087                machine.addTransition(b, in_pod, b, out_ok);
088                machine.addTransition(b, in_button, f, out_error);
089                machine.addTransition(b, in_clean, a, out_ok);
090
091                machine.addTransition(c, in_water, c, out_ok);
092                machine.addTransition(c, in_pod, d, out_ok);
093                machine.addTransition(c, in_button, f, out_error);
094                machine.addTransition(c, in_clean, a, out_ok);
095
096                machine.addTransition(d, in_water, d, out_ok);
097                machine.addTransition(d, in_pod, d, out_ok);
098                machine.addTransition(d, in_button, e, out_coffee);
099                machine.addTransition(d, in_clean, a, out_ok);
100
101                machine.addTransition(e, in_water, f, out_error);
102                machine.addTransition(e, in_pod, f, out_error);
103                machine.addTransition(e, in_button, f, out_error);
104                machine.addTransition(e, in_clean, a, out_ok);
105                
106                machine.addTransition(f, in_water, f, out_error);
107                machine.addTransition(f, in_pod, f, out_error);
108                machine.addTransition(f, in_button, f, out_error);
109                machine.addTransition(f, in_clean, f, out_error);
110                
111
112        return machine;
113    }
114    
115    public static CompactMealy<Symbol,String> constructMachine() {
116        return constructMachine(new CompactMealy<Symbol,String>(ALPHABET));
117    }
118        
119}