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}