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; }
/// <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 } }