Пример #1
0
        private Planning.HighLevelProgramExecution.Program Trans(Planning.HighLevelProgramExecution.Program program)
        {
            Planning.HighLevelProgramExecution.Program remainingProgram;

            if (program is Planning.HighLevelProgramExecution.Action)
            {
                remainingProgram = Planning.HighLevelProgramExecution.Program.EmptyProgram;

                Planning.HighLevelProgramExecution.Action programAction =
                    (Planning.HighLevelProgramExecution.Action)program;
                Action action = _actionDict[programAction.FullName];
                SendMessage(action.FullName);
                string responseName = ReceiveMessage();
                Console.WriteLine("Receive response: {0}", responseName);
                Response response = action.ResponseDict[responseName];
                _mentalAttitude.Update(response);
            }
            else if (program is SequenceStructure)
            {
                SequenceStructure seq = ((SequenceStructure)program);
                int i;
                for (i = 0; i < seq.SubProgramLength - 1; i++)
                {
                    if (!Final(seq.SubPrograms[i]))
                    {
                        break;
                    }
                }

                Planning.HighLevelProgramExecution.Program[] newRemainingProgramArray =
                    new Planning.HighLevelProgramExecution.Program[seq.SubProgramLength - i];
                newRemainingProgramArray[0] = Trans(seq.SubPrograms[i]);
                Parallel.For(1, newRemainingProgramArray.Length,
                             j => newRemainingProgramArray[j] = seq.SubPrograms[j + i]);

                remainingProgram = new SequenceStructure(newRemainingProgramArray);
            }
            else if (program is ConditionalStructure)
            {
                ConditionalStructure cond = (ConditionalStructure)program;
                remainingProgram = _mentalAttitude.Implies(cond.Condition)
                    ? Trans(cond.SubProgram1)
                    : Trans(cond.SubProgram2);
            }
            else if (program is LoopStructure)
            {
                LoopStructure loop = (LoopStructure)program;
                remainingProgram = _mentalAttitude.Implies(loop.Condition)
                    ? new SequenceStructure(new[] { Trans(loop.SubProgram), program })
                    : null;
            }
            else
            {
                throw new PlanningException("Trans an empty program!");
            }

            return(remainingProgram);
        }
Пример #2
0
        private bool Final(Planning.HighLevelProgramExecution.Program program)
        {
            bool result;

            if (program is EmptyProgram)
            {
                result = true;
            }

            else if (program is SequenceStructure)
            {
                SequenceStructure seq = ((SequenceStructure)program);
                result = true;
                foreach (var subProgram in seq.SubPrograms)
                {
                    if (!Final(subProgram))
                    {
                        result = false;
                        break;
                    }
                }
            }

            else if (program is ConditionalStructure)
            {
                ConditionalStructure cond = ((ConditionalStructure)program);
                return(_mentalAttitude.Implies(cond.Condition) ? Final(cond.SubProgram1) : Final(cond.SubProgram2));
            }

            else if (program is LoopStructure)
            {
                LoopStructure loop = ((LoopStructure)program);
                result = true;
                if (_mentalAttitude.Implies(loop.Condition))
                {
                    result = Final(loop.SubProgram);
                }
            }
            else
            {
                result = false;
            }

            return(result);
        }