Exemple #1
0
        /// <summary>
        /// 項・命題型を取得します。
        /// </summary>
        /// <param name="type">文字</param>
        /// <param name="termPropType">項・命題型</param>
        /// <returns>項・命題型</returns>
        private TermPropTypes GetTermPropType(
            Types type,
            TermPropTypes termPropType)
        {
            switch (type)
            {
            case Types.Value:
                return(TermPropTypes.Term);

            case Types.Square:
                return(termPropType);

            case Types.Function:
                return(TermPropTypes.Term);

            case Types.Predicate:
                return(TermPropTypes.Proposition);

            case Types.Conjunction:
                return(TermPropTypes.Proposition);

            case Types.Quantifier:
                return(termPropType);

            default:
                return(TermPropTypes.None);
            }
        }
Exemple #2
0
        /// <summary>
        /// 文字列インスタンスのコンストラクタです。
        /// </summary>
        /// <param name="charactors">文字列本体</param>
        /// <param name="chains">鎖</param>
        public CharSequence(List <Charactor> charactors, List <Tuple <Charactor, Charactor> > chains)
        {
            if (charactors == null || charactors.Count == 0)
            {
                throw new ArgumentException("最低一文字は指定してください");
            }

            Body         = charactors;
            Chains       = chains;
            TermPropType = GetTermPropType(charactors);
        }
Exemple #3
0
        /// <summary>
        /// 量化用コンストラクタ
        /// </summary>
        /// <param name="quantifier">量化記号</param>
        /// <param name="value">変数</param>
        /// <param name="sequence">文字列</param>
        public CharSequence(Charactor quantifier, Charactor value, CharSequence sequence)
        {
            if (quantifier.Type != Charactor.Types.Quantifier)
            {
                throw new ArgumentException("量化記号を指定してください");
            }

            if (value.Type != Charactor.Types.Value)
            {
                throw new ArgumentException("変数型を指定してください");
            }

            var bodyList = new List <Charactor> {
                quantifier
            };

            bodyList.AddRange(sequence.Body);

            // 量化変数を□に置き換え
            var chains = new List <Tuple <Charactor, Charactor> >();
            var body   = bodyList.Select(e =>
            {
                if (e.Name == value.Name)
                {
                    var sqr = new Charactor(e.Name, Charactor.Types.Square, 0, e.TermPropType);
                    return(sqr);
                }

                return(e);
            }).ToList();

            // 量化記号と□をchainで結ぶ
            foreach (var chr in body)
            {
                if (chr.Name == value.Name)
                {
                    chains.Add(new Tuple <Charactor, Charactor>(quantifier, chr));
                }
            }

            Body         = body;
            Chains       = chains;
            TermPropType = GetTermPropType(bodyList);
        }
Exemple #4
0
        /// <summary>
        /// 文字を生成します。
        /// </summary>
        /// <param name="name">名称</param>
        /// <param name="type">文字のタイプ</param>
        /// <param name="argCnt">引数の個数</param>
        /// <param name="termPropType">項・命題型</param>
        public Charactor(
            string name,
            Types type,
            int argCnt = 0,
            TermPropTypes termPropType = TermPropTypes.None)
        {
            Name = name;

            if (argCnt != 0)
            {
                if (type == Types.Value)
                {
                    throw new ArgumentException("引数の個数を指定できない文字タイプです");
                }

                if (type == Types.Square)
                {
                    throw new ArgumentException("引数の個数を指定できない文字タイプです");
                }
            }

            if (termPropType != TermPropTypes.None)
            {
                if (type != Types.Quantifier && type != Types.Square)
                {
                    throw new ArgumentException("項・命題型を指定できない文字タイプです");
                }
            }

            if (type == Types.Quantifier)
            {
                argCnt = 1;
            }

            Type         = type;
            ArgCount     = argCnt;
            TermPropType = GetTermPropType(type, termPropType);
        }