Skip to content

Instantly share code, notes, and snippets.

@frame-lang
Created November 9, 2018 01:59
Show Gist options
  • Save frame-lang/bbfbb23c7b5ae3f61c3f9e06fe4e57fc to your computer and use it in GitHub Desktop.
Save frame-lang/bbfbb23c7b5ae3f61c3f9e06fe4e57fc to your computer and use it in GitHub Desktop.
//-------------------------------------------------//
// //
// FMN //
// //
//-------------------------------------------------//
// Original source is course material for cs4731 at Georgia Institute of Technology
// Author: Dr. Stephen Lee-Urban
// see https://www.cc.gatech.edu/~surban6/2016-cs4731/lectures/2016_06_02_DecisionMaking_FSM.pdf
#GaTech_cs4731_fsm3
-interface-
no_percept
predator
no_predator
hungry
hungry_food
-machine-
$Idle
|predator| ->> $Flee ^
|hungry| ->> $FindFood ^
$Search => $FindFood
|hungry_food| ->> $Eat ^
$Eat => $FindFood
|hungry| ->> $Search ^
$FindFood
|predator| ->> $Flee ^
|no_percept| ->> $Idle ^
$Run => $Flee
|hungry_food| ->> $RunSearch ^
$RunSearch => $Flee
|hungry| ->> $Run ^
$Flee
|no_percept| ->> $Idle ^
|no_predator| ->> $FindFood ^
//-------------------------------------------------//
// //
// Implementation //
// //
//-------------------------------------------------//
class FrameEvent {
var _msg:String
var _params:Object
var _return:Object
FrameEvent(msg:String, params:Object = null) {
_msg = msg
_params = params
}
}
//-------------------------------------------------//
class GaTech_cs4731_fsm3 {
/**********************************
-interface-
predator
predator_hungry
hungry
hungry_food
***********************************/
func predator() { _state(new FrameEvent("predator")) }
func predator_hungry() { _state(new FrameEvent("predator_hungry")) }
func hungry() { _state(new FrameEvent("hungry")) }
func hungry_food() { _state(new FrameEvent("hungry_food")) }
// -machine-
var _state(e:FrameEvent) = Idle
/**********************************
$Idle
|predator| ->> $Flee ^
|hungry_food| ->> $Eat ^
|hungry| ->> $Search ^
***********************************/
func GatherTreasure(e:FrameEvent) {
if (e._msg == "monsterInSight") {
_state = Flee
return
}
}
/**********************************
$Flee
|predator_hungry| ->> $FleeSearch ^
***********************************/
func Flee(e:FrameEvent) {
if (e._msg == "predator_hungry") {
_state = FleeSearch
return
}
}
/**********************************
$Search
|predator| ->> $Flee ^
|hungry_food| ->> $Eat ^
|predator_hungry| ->> $FleeSearch ^
***********************************/
func Search(e:FrameEvent) {
if (e._msg == "predator") {
_state = Flee
return
}
if (e._msg == "hungry_food") {
_state = Eat
return
}
if (e._msg == "predator_hungry") {
_state = FleeSearch
return
}
}
/**********************************
$Eat
|predator| ->> $Flee ^
|hungry| ->> $Search ^
***********************************/
func Eat(e:FrameEvent) {
if (e._msg == "predator") {
_state = Flee
return
}
if (e._msg == "hungry") {
_state = Search
return
}
}
/**********************************
$FleeSearch
|predator| ->> $Flee ^
***********************************/
func FleeSearch(e:FrameEvent) {
if (e._msg == "predator") {
_state = Flee
return
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment