public void Check()
        {
            if (_items.Any(p => p.Kind == KindOfLinguisticVariableConstraintItem.Unknown))
            {
                throw new Exception("Linguistic variable constraints can not be Unknown!");
            }

            if (_items.Any(p => p.Kind == KindOfLinguisticVariableConstraintItem.Inheritance))
            {
                if (_items.Count(p => p.Kind == KindOfLinguisticVariableConstraintItem.Inheritance) > 1)
                {
                    throw new Exception("Linguistic variable's constraints for inheritance is duplicated!");
                }

                if (!_items.Any(p => p.Kind == KindOfLinguisticVariableConstraintItem.Relation && p.RelationName.NameValue == "is"))
                {
                    var relationItem = new LinguisticVariableConstraintItem()
                    {
                        Kind = KindOfLinguisticVariableConstraintItem.Relation
                    };
                    relationItem.RelationName = NameHelper.CreateName("is");
                    _items.Add(relationItem);
                }
            }

            if (_items.Any(p => p.Kind == KindOfLinguisticVariableConstraintItem.Relation))
            {
                var groppedItems = _items.Where(p => p.Kind == KindOfLinguisticVariableConstraintItem.Relation).GroupBy(p => p.RelationName).Where(p => p.Count() > 1).Select(p => $"`{p.Key.NameValue}`");

                if (groppedItems.Any())
                {
                    if (groppedItems.Count() == 1)
                    {
                        throw new Exception($"Linguistic variable's constraint for relation {groppedItems.First()} is duplicated!");
                    }
                    else
                    {
                        throw new Exception($"Linguistic variable's constraints for relation {string.Join(", ", groppedItems)} are duplicated!");
                    }
                }

                if (_items.Any(p => p.Kind == KindOfLinguisticVariableConstraintItem.Relation && p.RelationName.NameValue == "is") && !_items.Any(p => p.Kind == KindOfLinguisticVariableConstraintItem.Inheritance))
                {
                    var inheritanceItem = new LinguisticVariableConstraintItem()
                    {
                        Kind = KindOfLinguisticVariableConstraintItem.Inheritance
                    };
                    _items.Add(inheritanceItem);
                }
            }
        }
        public void AddItem(LinguisticVariableConstraintItem item)
        {
            if (item == null)
            {
                throw new ArgumentNullException(nameof(item));
            }

            if (_items.Contains(item))
            {
                return;
            }

            _items.Add(item);
        }
Example #3
0
        /// <summary>
        /// Clones the instance using special context and returns cloned instance.
        /// </summary>
        /// <param name="context">Special context for providing references continuity.</param>
        /// <returns>Cloned instance.</returns>
        public LinguisticVariableConstraintItem Clone(Dictionary <object, object> context)
        {
            if (context.ContainsKey(this))
            {
                return((LinguisticVariableConstraintItem)context[this]);
            }

            var result = new LinguisticVariableConstraintItem();

            context[this] = result;

            result.Kind         = Kind;
            result.RelationName = RelationName.Clone(context);

            return(result);
        }