/// <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); } }
/// <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); }
/// <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); }
/// <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); }