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