Fight()なら Fighter F Magician M Slime S Flame F MetalSlime MS として OptimalActsという関数テーブルを用意して F M S Slash() Fire() F Slash() Blizzard() MS Use(holywater) Use(holywater) その通りに呼び出せばよいし、OptimalActsをとるかどうかは、MonsterKnowledgeで制御すればいい MonsterKnowledgeはmutableでなければならないし、OptimalActsはimmutableでもよい。