using AIMA.Agent.Action; using AIMA.Agent.Percept; using AIMA.Agent.Program; namespace AIMA.Agent { public abstract class AgentBase : IAgent where T1: IAction where T2: IPercept { protected readonly IAgentProgram _agentProgram; protected AgentBase(IAgentProgram agentProgram) { _agentProgram = agentProgram; } private bool Alive { get; set; } public virtual T1 Execute(T2 percept) { if(_agentProgram is not null) { return _agentProgram.Execute(percept); } return (T1)(NoOpAction.NO_OPERATION as IAction); } public bool IsAlive() => Alive; public virtual void SetAlive(bool alive) => Alive = alive; } }