Пример #1
0
 Set<Term> GetAutomatonParameterDomain(Term startState, Symbol actionSymbol, int parameterIndex)
 {
     Set<Term> result = Set<Term>.EmptySet;
     Set<Transition> outgoing = this.automaton.OutgoingTransitions(startState);
     foreach (Transition transition in outgoing)
     {
         CompoundTerm ct = transition.Second as CompoundTerm;
         if (ct == null || parameterIndex >= ActionArity(actionSymbol))
             throw new InvalidOperationException("Internal error");
         if (actionSymbol.Equals(ct.Symbol))
             result = result.Add(ct.Arguments[parameterIndex]);
     }
     return result;
 }
Пример #2
0
        /// <summary>
        /// Returns true if the given action symbol is possibly enabled in the given state
        /// </summary>
        /// <param name="state"></param>
        /// <param name="actionSymbol"></param>
        /// <returns></returns>
        public override bool IsPotentiallyEnabled(IState state, Symbol actionSymbol)
        {
            // Case 1: ready mode
            if (state.ControlMode.Equals(readyControlMode))
            {
                return IsPotentiallyEnabled_Internal(state, actionSymbol);
            }
            // Case 2: intermediate step.
            else
            {
                // to do: handle multiple continuations by checking if actionSymbol
                // is found in dictionary of continuations.

                // Temp: just handle start/finish idiom for now
                if (ActionSymbolKind(actionSymbol) != ActionKind.Finish)
                    return false;

                CompoundTerm startAction = CurrentStackFrame(state);
                Symbol startActionSymbol = startAction.Symbol;

                return ActionSymbolKind(startActionSymbol) == ActionKind.Start &&           // must be in the middle of an action
                       actionSymbol.Equals(this.finishActionSymbols[startActionSymbol]);    // start and finish symbols must match names
            }
        }