/* Describes finete state machine objects */ %:-module fsm. %:-public fsm/3, fsm_transition/2, fsm_transiton_backtrackable/2. %:-public test_fsm1, test_fsm12. fsm(StateList, InitialState, FSM):- assignable(FSM , fsm(StateList,InitialState)). fsm_transition(FSM,Event):- FSM => fsm(StateList,CurrentState), fsm_lookup(StateList,Event,CurrentState,NextState),!, write(CurrentState-Event-NextState),nl, FSM <+ fsm(StateList,NextState). fsm_transition_backtrackable(FSM,Event):- FSM => fsm(StateList,CurrentState), fsm_lookup(StateList,Event,CurrentState,NextState), write(CurrentState-Event-NextState),nl, FSM <= fsm(StateList,NextState). fsm_lookup([State-Event-NextState|_],Event,State, NextState). fsm_lookup([_|StateList],Event,State, NextState):- fsm_lookup(StateList,Event,State, NextState). fsm_state(FSM,State):- FSM => fsm(_,State). /* fsm transition example */ %:-public test_fsm. test_fsm1:- fsm([ red-0-red,red-1-green,red-2-red, yellow-0-red,yellow-1-green,yellow-2-red, green-0-yellow,green-1-yellow,green-2-red], red, FSM), fsm_transition(FSM,0), fsm_state(FSM,State1), State1 = red, fsm_transition(FSM,1), fsm_state(FSM,State2), State2 = green, fsm_transition(FSM,1), fsm_state(FSM,State3), State3 = yellow, fsm_transition(FSM,2), fsm_state(FSM,State4), State4 = red, true. /* non deterministic fsm transition */ test_fsm2:- fsm([ red-0-red,red-0-green,red-2-red, yellow-0-red,yellow-1-green,yellow-2-red, green-0-yellow,green-1-yellow,green-2-red], red, FSM), test_fsm2(FSM). test_fsm2(FSM):- fsm_transition_backtrackable(FSM,0), fsm_state(FSM,State), % State is red or green write(State),nl, State == green. % if State == red, fail