Пример #1
0
        public object doMLVForPoint(GameCell gameCell)
        {
            log();
            object result="Клетка пуста.";
            if (gameCell.FrameExample != null && gameCell.FrameExample.BaseFrame != null && gameCell.FrameExample.BaseFrame.FrameId != -1)
            {
                situations = gatherSituationsList();

                situationExample = new FrameExample();
                Slot slotAgent = new Slot();
                slotAgent.SlotName = "agent";
                slotAgent.SlotType = SlotType.Frame;
                slotAgent.SlotInheritance = SlotInherit.Override;
                slotAgent.IsSystem = false;
                situationExample.AddSlot(slotAgent);
                situationExample.SetValue("agent", gameCell.FrameExample);
                Frame situationToCheck = this.getNextFrameToCheck();

                while (!situationExample.ContainsSlot("action") && situationToCheck != null) //пока не определили целевой слот "действие"
                {
                    checkedFramesIDs.Add(situationToCheck.FrameId);
                    if (checkSituation(situationToCheck, situationExample))
                    {
                        Slot actionSlot = situationToCheck.GetSlotByName("action");
                        situationExample.AddSlot(actionSlot);
                        situationExample.SetValue(actionSlot.SlotName, actionSlot.SlotDefault);
                    }
                    situationToCheck = this.getNextFrameToCheck();
                }
                result = null;
                if (situationExample.ContainsSlot("action"))
                    result = situationExample.Value("action");
            }
            return result;
        }
Пример #2
0
        /// <summary>
        /// Попробовать привязаться к конкретной ситуации
        /// </summary>
        /// <param name="situationPrototype">Ситуация, к которой мы хотим привязаться (которую мы проверяем)</param>
        /// <param name="situationExample">Текущий фрейм-экземпляр</param>
        /// <returns>true - если привязалась. false - в противном случае.</returns>
        private bool checkSituation(Frame situationPrototype, FrameExample situationExample, int recursionLevel=0)
        {
            log("Проверяем ситуацию: " + situationPrototype.FrameName, recursionLevel);
            bool result = true;
            if (passedSituationsIds.Contains(situationPrototype.FrameId))
                result = true;
            else
            {
                if (failedSituationsIds.Contains(situationPrototype.FrameId))
                    result = false;
                else
                {

                    checkedFramesIDs.Add(situationPrototype.FrameId);
                    List<Slot> boundedSlots = new List<Slot>(); //привязавшиеся слоты
                    Dictionary<string, object> slotValues = new Dictionary<string, object>(); //значения привязавшихся слотов

                    foreach (Slot slot in situationPrototype.FrameSlots)
                    {
                        if (slot.SlotMarker != null && !situationExample.ContainsSlot(slot.SlotName))
                        {
                            object slotValue;

                            //                    if (situationExample.ContainsSlot(slot.SlotName))
                            //                        slotValue = situationExample.Value(slot.SlotName);
                            //                    else
                            if (!situationExample.ContainsSlot(slot.SlotName))
                            {
                                slotValue = boundSlot(slot, situationPrototype, situationExample);

                                if (slotValue == null)
                                {
                                    result = false;
                                    break;
                                }
                                else
                                {
                                    boundedSlots.Add(slot);
                                    slotValues.Add(slot.SlotNameTrimmed, slotValue);
                                }
                            }
                        }
                    }
                    if (result)
                    {
                        log("+ Ситуация " + situationPrototype.FrameName + " прошла проверку (исключая родителей).", recursionLevel);

                        passedSituationsIds.Add(situationPrototype.FrameId);
                        foreach (Slot boundedSlot in boundedSlots)
                        {
                            if (!situationExample.ContainsSlot(boundedSlot.SlotName))
                            {
                                situationExample.AddSlot(boundedSlot);
                                situationExample.SetValue(boundedSlot.SlotName, slotValues[boundedSlot.SlotNameTrimmed]);
                            }
                        }

                        if (situationPrototype.GetParentFrame() != null)
                        {
                            log("Привязка родителей ситуации " + situationPrototype.FrameName + "...", recursionLevel);
                            result = checkSituation(situationPrototype.GetParentFrame(), situationExample, recursionLevel+1);
                        }
                    }
                    else
                    {
                        failedSituationsIds.Add(situationPrototype.FrameId);
                        log("- Ситуация " + situationPrototype.FrameName + " не привязалась.", recursionLevel);
                    }

                    if (result)
                    {
                        log("Ситуация " + situationPrototype.FrameName + " Привязалась полностью.", recursionLevel);
                        //TODO:
                        //тут еще как-то, думаю, будут использоваться задания отсутствия
                        //плюс, возможно, нужно будет добпвлять не только привязавшиеся слоты, но и вообще все.

                    }
                }
            }
            return result;
        }