<!ENTITY % Statechart.Elements " statechart | sList | tList | sSeq |
    sAlternative | sDefault | timeOut | entryAct | exitAct | 
    throughout | tNorm | tCond | tSel | actionTaken | activity | 
    guardCond | sFrom | sTo | sEnd | sepToStates | sSep | choices | 
    choice | aStart | someOtherCondition | aState | aSuspend | 
    aResume | aStarted | aStopped | aEntered | aExited | aActive | 
    aSuspended | aCompleted " >
  
<!ENTITY % KQML.terms " complete | do | evaluate | forward | 
    isAbleTo | makeValue | possibleChoice | process | register | 
    responseTo | sendMsg | subscribe | truthStatus | undo | setOf | 
    oneValue | forElem " >
    
<!ENTITY % Expandable.vocab " vterm | attr " >

<!ENTITY % Std.vocab " thisPerson | bel | is | bitbucket | 
    isTrueFalse | aTerm | respondingTo | timePeriod " >

<!ENTITY % Vocabulary 
	   " %Expandable.vocab | %Std.vocab; | %KQML.terms;"  >

<!-- <!ENTITY % Vocabulary "%Statechart.Elements; | %KQML.terms;"  >  -->

<!ENTITY % Logical.Forms " andMsg | orMsg | isNotMsg | iffMsg | 
    ifThenMsg | ifThenElseMsg " >
<!ENTITY % Simple.Content " %Vocabulary; | predSt | 
    %Logical.Forms; " >
<!ENTITY % Content "flbcMsg | simpleAct | %Simple.Content; " >

<!ENTITY % Person.ID " person | thisPerson | all | one " >

<!ELEMENT flbcMsg (simpleAct, context?) >
<!ATTLIST flbcMsg
  msgID	ID	#IMPLIED
  grammar	NMTOKEN	"4"
  vocab	NMTOKEN	"norm"
  literal	( literal | any )	"literal" >
  
<!ELEMENT simpleAct (illocAct+) >
<!ATTLIST simpleAct
  id	ID	#IMPLIED
  speaker	IDREF	#REQUIRED
  hearer	IDREF	#REQUIRED >
<!ELEMENT illocAct ( %Content;   )>
<!ATTLIST illocAct
  id	ID	#IMPLIED
  force ( advise | ascribe | assent | assert | concede | confirm |
     denial | describe | dispute | dissent | inform | offer | 
     permit | predict | prohibit | promise | question | request |
     require | retract | report )	#REQUIRED>

<!ELEMENT predSt (#PCDATA)>
<!ATTLIST predSt
  id	ID	#IMPLIED
  language	( prolog | lisp | kif | xml ) "prolog">

<!ELEMENT andMsg (%Content;)+>
<!ATTLIST andMsg
  id	ID	#IMPLIED>

<!ELEMENT orMsg (%Simple.Content;)+>
<!ATTLIST orMsg
  id	ID	#IMPLIED>

<!ELEMENT isNotMsg (%Simple.Content;)>
<!ATTLIST isNotMsg
  id	ID	#IMPLIED>
<!-- Interpreted as "It is not true that X" -->

<!ELEMENT iffMsg ((%Simple.Content;), (%Simple.Content;))>
<!ATTLIST iffMsg
  id	ID	#IMPLIED>
<!-- Interpreted as "X is true if and only if Y is true" -->

<!ELEMENT ifThenMsg ((%Simple.Content;), (%Content;)) >
<!ATTLIST ifThenMsg
  id	ID	#IMPLIED>
<!-- Interpreted as "If X is true, then Y is true" -->

<!ELEMENT ifThenElseMsg ((%Simple.Content;), (%Content;), 
    (%Content;)) >
<!ATTLIST ifThenElseMsg
  id	ID	#IMPLIED>
  
<!ELEMENT setOf (%Simple.Content;)>
<!ATTLIST setOf
  id	ID	#IMPLIED>
<!-- Interpreted as "X is a set of values." -->

<!ELEMENT oneValue (%Simple.Content;)>
<!ATTLIST oneValue
  id	ID	#IMPLIED>
<!-- Interpreted as X is one value." -->

<!ELEMENT forElem (%Simple.Content;) >
<!ATTLIST forElem
  theTerm	ID	#IMPLIED
  howMany	(all | one)	#REQUIRED
  theSet	IDREF	#REQUIRED >

<!ELEMENT context (resources?, variables?, respondingTo?,
      (timeSent | alsoSentTo | alsoAddressedTo | forwardedBy )*) >
<!ATTLIST context
  newConv	( yes | no )	"no" 
  sendingMachine	NMTOKEN	#IMPLIED
  convStack	NMTOKENS	#IMPLIED
  interruptType (interruption | subordination | correction ) 
  			#IMPLIED >

<!ELEMENT resources (actors?) >
<!ATTLIST resources
  id	ID	#IMPLIED >
  
<!ELEMENT actors ((%Person.ID;)*) >
<!ATTLIST actors
  id	ID	#IMPLIED >
  
<!ELEMENT variables (var*) >
<!ATTLIST variables
  id	ID	#IMPLIED >
  
<!ELEMENT var EMPTY >
<!ATTLIST var
  id	ID	#IMPLIED 
  ref	IDREF	#IMPLIED >

<!ELEMENT respondingTo EMPTY >
<!ATTLIST respondingTo
  message	NMTOKEN	#REQUIRED >
  
<!ELEMENT timeSent (time) >
<!ATTLIST timeSent
  id	ID	#IMPLIED>

<!ELEMENT alsoSentTo ((%Person.ID;)+)>
<!ATTLIST alsoSentTo
  id	ID	#IMPLIED>

<!ELEMENT alsoAddressedTo ((%Person.ID;)+) >
<!ATTLIST alsoAddressedTo
  id	ID	#IMPLIED>

<!ELEMENT forwardedBy ((%Person.ID;)+) >
<!ATTLIST forwardedBy
  id	ID	#IMPLIED>

<!ELEMENT time EMPTY>
<!ATTLIST time
  id	ID	#IMPLIED
  year	NMTOKEN	#REQUIRED
  month	NMTOKEN	#REQUIRED
  dayOfMonth 	NMTOKEN	#REQUIRED
  hour	NMTOKEN	#REQUIRED
  min	NMTOKEN	#REQUIRED
  sec	NMTOKEN	#REQUIRED >
<!ELEMENT person EMPTY>
<!ATTLIST person
  id	ID	#REQUIRED
  name	CDATA	#IMPLIED 
  assocURL	CDATA	#IMPLIED>
  
<!ELEMENT vterm EMPTY>
<!ATTLIST vterm 
  name    NMTOKEN   #REQUIRED >
  
<!ELEMENT attr EMPTY>
<!ATTLIST attr
  name    NMTOKEN   #REQUIRED 
  val     NMTOKEN   #REQUIRED >
  
<!ELEMENT all EMPTY>
<!ELEMENT one EMPTY>

<!ELEMENT thisPerson EMPTY>
<!ATTLIST thisPerson
  who	IDREF	#REQUIRED >
  
<!ELEMENT bel ((%Person.ID;), (%Simple.Content;)) >
<!ATTLIST bel
  id	ID	#IMPLIED>

<!ELEMENT is ((%Simple.Content;), (%Simple.Content;)) >
<!ATTLIST is
  id	ID	#IMPLIED>

<!ELEMENT bitbucket (#PCDATA) >
<!ATTLIST bitbucket
  id	ID	#IMPLIED>

<!ELEMENT isTrueFalse (%Content;) >
<!ATTLIST isTrueFalse
  id	ID	#IMPLIED>
  
<!ELEMENT aTerm EMPTY >
<!ATTLIST aTerm
  theTerm	IDREF	#REQUIRED >
  
<!ELEMENT now EMPTY>
  
<!ENTITY % Time.Modifier " before | after | now " >


<!ELEMENT timePeriod ((%Time.Modifier;), (%Simple.Content;)) >
<!ATTLIST timePeriod
  id	ID	#IMPLIED >

<!ELEMENT before ( now | time) >
<!ATTLIST before
  id	ID	#IMPLIED >  
  
<!ELEMENT after ( now | time) >
<!ATTLIST after
  id	ID	#IMPLIED >

  
<!ELEMENT complete (%Simple.Content;) >
<!ATTLIST complete
  id	ID	#IMPLIED>

<!ELEMENT do ((%Person.ID;), (%Simple.Content;)) >
<!ATTLIST do
  id	ID	#IMPLIED>

<!ELEMENT evaluate (%Simple.Content;) >
<!ATTLIST evaluate
  id	ID	#IMPLIED>

<!ELEMENT forward ((%Person.ID;), bitbucket) >
<!ATTLIST forward
  id	ID	#IMPLIED>

<!ELEMENT isAbleTo ((%Person.ID;), (%Simple.Content;)) >
<!ATTLIST isAbleTo
  id	ID	#IMPLIED>

<!ELEMENT makeValue (possibleChoice, (%Simple.Content;)) >
<!ATTLIST makeValue
  id	ID	#IMPLIED>

<!ELEMENT possibleChoice ((%Simple.Content;)*) >
<!ATTLIST possibleChoice
  id	ID	#IMPLIED
  solutions ( noBelief | false | listOfValues ) 
     #REQUIRED
  howMany ( all | one ) #REQUIRED 
  howSent ( allAtOnce | oneAtATime ) #IMPLIED >
  
<!ELEMENT process ((%Person.ID;), (%Simple.Content;)) >
<!ATTLIST process
  id	ID	#IMPLIED>

<!ELEMENT register ((%Person.ID;), (%Simple.Content;)) >
<!ATTLIST register
  id	ID	#IMPLIED>

<!ELEMENT responseTo EMPTY >
<!ATTLIST responseTo 
  id	ID	#IMPLIED
  message	NMTOKEN	#REQUIRED >
  
<!ELEMENT sendMsg (flbcMsg) >
<!ATTLIST sendMsg
  id	ID	#IMPLIED>

<!ELEMENT subscribe ((%Person.ID;), (%Simple.Content;)) >
<!ATTLIST subscribe
  id	ID	#IMPLIED>

<!ELEMENT truthStatus (%Simple.Content;) >
<!ATTLIST truthStatus
  id	ID	#IMPLIED
  theStatus ( true | false )	#IMPLIED >
  
<!ELEMENT undo ((%Person.ID;), (%Content;)) >
<!ATTLIST undo
  id	ID	#IMPLIED>
  
  
<!ENTITY % Basic.State.Detail " entryAct | exitAct | throughout " >
<!ENTITY % State.Detail " sDefault | timeOut | %Basic.State.Detail; " >
<!ENTITY % Transition " tNorm | tCond | tSel " >

<!ENTITY % State " sBasic | sSeq | sAlternative | sHistory " >

<!ELEMENT statechart (sList, tList, 
		    ( sDefault | %Basic.State.Detail;)*) >
<!ATTLIST statechart
  id ID #REQUIRED 
  name CDATA ""
  desc CDATA "" >

<!ELEMENT sList ((%State;)+) >
<!ATTLIST sList
  id	ID	#IMPLIED>

<!ELEMENT tList ( (%Transition;)+ ) >
<!ATTLIST tList
  id	ID	#IMPLIED>

<!ELEMENT sSeq ( sList, (%State.Detail;)* ) >
<!ATTLIST sSeq
  id 	ID 	#REQUIRED
  name 	CDATA 	""
  desc 	CDATA 	#IMPLIED>

<!ELEMENT sAlternative ( sList, (%State.Detail;)* ) >
<!ATTLIST sAlternative
  id	ID 	#REQUIRED
  name 	CDATA 	""
  desc 	CDATA 	#IMPLIED >

<!ELEMENT sBasic ( (%State.Detail;)* ) >
<!ATTLIST sBasic
  id 	ID 	#REQUIRED
  name 	CDATA 	""
  desc 	CDATA 	#IMPLIED >
  
<!ELEMENT sHistory EMPTY >
<!ATTLIST sHistory
  id 	ID 	#REQUIRED 
  type 	(oneLevel | allLevels ) "oneLevel" >
  
<!ELEMENT sDefault (#PCDATA) >
<!ATTLIST sDefault
  state 	IDREF 	#REQUIRED >

<!ELEMENT timeOut EMPTY>
<!ATTLIST timeOut
  id	ID	#IMPLIED
  lower	CDATA	#REQUIRED
  upper	CDATA	#REQUIRED >

<!ELEMENT entryAct ( (actionTaken | activity)+ ) >
<!ATTLIST entryAct
  id	ID	#IMPLIED>

<!ELEMENT exitAct ( (actionTaken | activity)+ ) >
<!ATTLIST exitAct
  id	ID	#IMPLIED>

<!ELEMENT throughout (activity)+ >
<!ATTLIST throughout
  id	ID	#IMPLIED>

<!ENTITY % Harel.Paper.Triggers " alpha | beta | delta | gamma | 
    rho | mu | hits | buttonPress | timeInState " >

<!-- elements for the Harel paper -->
<!-- these are all actions, take zero time -->
<!ELEMENT alpha EMPTY >
<!ELEMENT beta EMPTY >
<!ELEMENT delta EMPTY >
<!ELEMENT gamma EMPTY >
<!ELEMENT rho EMPTY >
<!ELEMENT mu EMPTY >
<!ELEMENT hits EMPTY >
<!ATTLIST hits
  alarm ( 1 | 2 ) "1"
  time CDATA #REQUIRED >
<!ELEMENT buttonPress EMPTY >
<!ATTLIST buttonPress
  which ( a | b | c | d | any ) "any" >
<!ELEMENT timeInState EMPTY >
<!ATTLIST timeInState
  which 	IDREF 	#REQUIRED
  duration 	CDATA 	#REQUIRED
  units ( msec | sec | min | hr | day ) "sec" >

<!ENTITY % App.Area.Triggers " %Harel.Paper.Triggers; " >

<!ENTITY % General.Triggers " andT | orT | notT " >

<!ENTITY % Trigger " %General.Triggers; | %App.Area.Triggers; " >

<!ELEMENT andT (%Trigger;)+ >
<!ATTLIST andT
  id	ID	#IMPLIED>

<!ELEMENT orT (%Trigger;)+ >
<!ATTLIST orT
  id	ID	#IMPLIED>

<!ELEMENT notT (%Trigger;) >
<!ATTLIST notT
  id	ID	#IMPLIED>

<!ELEMENT trigger (%Trigger;) >
<!ATTLIST trigger
  id	ID	#IMPLIED>

<!ELEMENT tNorm (trigger?, guardCond?, actionTaken?) >
<!ATTLIST tNorm 
  id	ID	#IMPLIED
  from 	IDREFS 	#REQUIRED
  to 	IDREFS 	#REQUIRED >

<!ELEMENT tCond (trigger?, sepToStates) >
<!ATTLIST tCond
  id	ID	#IMPLIED
  from IDREFS #REQUIRED >

<!ELEMENT tSel (trigger?, sFrom, choices, sepToStates) >
<!ATTLIST tSel
  id	ID	#IMPLIED
  question CDATA #IMPLIED >


<!ENTITY % Harel.Paper.Conditions " enabled | timesEqual |
    pCond | qCond | rCond " >
    
<!-- these are conditions from the Harel paper -->
<!ELEMENT enabled EMPTY >
<!ATTLIST enabled
  id	ID	#IMPLIED
  alarm CDATA #REQUIRED >
<!ELEMENT timesEqual EMPTY >
<!ATTLIST timesEqual
  id	ID	#IMPLIED
  t1 	CDATA 	#REQUIRED 
  t2 	CDATA 	#REQUIRED >
<!ELEMENT pCond EMPTY >
<!ATTLIST pCond
  id	ID	#IMPLIED>
  
<!ELEMENT qCond EMPTY >
<!ATTLIST qCond
  id	ID	#IMPLIED>
  
<!ELEMENT rCond EMPTY >
<!ATTLIST rCond
  id	ID	#IMPLIED>

<!ENTITY % App.Area.Conditions " %Harel.Paper.Conditions; " >

<!ENTITY % General.Conditions " andC | orC | notC | inState " >

<!ENTITY % Condition " %General.Conditions; | 
		      %App.Area.Conditions; " >

<!ELEMENT andC (%Condition;)+ >
<!ATTLIST andC
  id	ID	#IMPLIED>
  
<!ELEMENT orC (%Condition;)+ >
<!ATTLIST orC
  id	ID	#IMPLIED>
  
<!ELEMENT notC (%Condition;) >
<!ATTLIST notC
  id	ID	#IMPLIED>
  
<!ELEMENT inState EMPTY >
<!ATTLIST inState
  id	ID	#IMPLIED
  state 	IDREF 	#REQUIRED >

<!ENTITY % General.Actions " aStart | aStop | aSuspend | 
    aResume | aStarted | aActive | aStopped | aSuspended | 
    aResumed | aCompleted" >

<!ELEMENT aStart ( activity ) >
<!ATTLIST aStart
  id	ID	#IMPLIED>

<!ELEMENT aStop ( activity ) >
<!ATTLIST aStop
  id	ID	#IMPLIED>

<!ELEMENT aSuspend ( activity ) >
<!ATTLIST aSuspend
  id	ID	#IMPLIED>

<!ELEMENT aResume ( activity ) >
<!ATTLIST aResume
  id	ID	#IMPLIED>

<!ELEMENT aStarted ( activity ) >
<!ATTLIST aStarted
  id	ID	#IMPLIED>

<!ELEMENT aActive ( activity ) >
<!ATTLIST aActive
  id	ID	#IMPLIED>

<!ELEMENT aStopped ( activity ) > 
<!ATTLIST aStopped
  id	ID	#IMPLIED>

<!ELEMENT aSuspended ( activity ) > 
<!ATTLIST aSuspended
  id	ID	#IMPLIED>

<!ELEMENT aResumed ( activity ) >
<!ATTLIST aResumed
  id	ID	#IMPLIED>

<!ELEMENT aCompleted ( activity ) > 
<!ATTLIST aCompleted
  id	ID	#IMPLIED>

<!ENTITY % App.Area.Actions " vAct | sAct | betaAct | tAct | 
			xAct | wAct | uAct " >

<!ELEMENT betaAct EMPTY >
<!ELEMENT sAct EMPTY >
<!ELEMENT tAct EMPTY >
<!ELEMENT uAct EMPTY >
<!ELEMENT vAct EMPTY >
<!ELEMENT wAct EMPTY >
<!ELEMENT xAct EMPTY >

<!ELEMENT actionTaken ( %General.Actions; | %App.Area.Actions; ) >
  
<!ELEMENT activity EMPTY >
<!ATTLIST activity
  id	ID	#IMPLIED
  procedure 	CDATA 	#REQUIRED >

<!ELEMENT guardCond ( %Condition; ) >
<!ATTLIST guardCond
  id	ID	#IMPLIED>

<!ELEMENT sFrom ( sEnd+ ) >
<!ATTLIST sFrom
  id	ID	#IMPLIED>

<!ELEMENT sTo ( sEnd+ ) >
<!ATTLIST sTo
  id	ID	#IMPLIED>

<!ELEMENT sEnd EMPTY >
<!ATTLIST sEnd
  id 	ID 	#REQUIRED
  type 	( whole | somePart ) "whole" >

<!ELEMENT sepToStates ( sSep+ ) >
<!ATTLIST sepToStates
  id	ID	#IMPLIED>

<!ELEMENT sSep ( guardCond, actionTaken) > 
<!ATTLIST sSep 
  id	ID	#IMPLIED
  to IDREF #REQUIRED >

<!ELEMENT choices ( choice+ ) >
<!ATTLIST choices
  id	ID	#IMPLIED>

<!ELEMENT choice ( actionTaken ) >
<!ATTLIST choice 
  id	ID	#IMPLIED
  desc 	NMTOKEN 	#REQUIRED >
