Esempio n. 1
0
        /// <summary>
        /// 2つの乗法標準形の論理式が包摂しているか判定する
        /// </summary>
        /// <param name="lCnf">論理式1</param>
        /// <param name="rCnf">論理式2</param>
        /// <returns>包摂している:True、していない:False</returns>
        /// <remarks></remarks>
        private bool IsSubsumption(CNFofEquation lCnf, CNFofEquation rCnf)
        {
            //一致条件の左辺の文字コード順で並べ替える
            lCnf.Sort();
            rCnf.Sort();

            //最初にeq2とeq1の変数名を比較するため、Forループ前にMoveNext()する
            if (!rCnf.MoveNext())
            {
                //cnfに素論理式がなければ、包摂している
                lCnf.Reset();
                rCnf.Reset();
                return(true);
            }
            Equation eq2 = rCnf.Current;

            foreach (Equation eq1 in lCnf)
            {
                //eq1と同じ素論理式までrCnfをイテレートする
                //Equation eq2 = null;
                //while(rCnf.MoveNext()) {
                //  eq2 = rCnf.Current;
                //  if(eq2.Variable >= eq1.Variable) {
                //    break;
                //  }
                //}

                //eq1と同じ素論理式までrCnfをイテレートする
                while (eq2.Variable.CompareTo(eq1.Variable) < 0 && rCnf.MoveNext())
                {
                    eq2 = rCnf.Current;
                }

                //cnfが最後までイテレートされていれば、包摂している
                if (eq2 == null)
                {
                    //読込位置をリセットする
                    lCnf.Reset();
                    rCnf.Reset();
                    return(true);
                }

                //素論理式の包摂判定
                if (eq2.Variable == eq1.Variable && eq2.Value != eq1.Value)
                {
                    //読込位置をリセットする
                    lCnf.Reset();
                    rCnf.Reset();
                    //包摂していない
                    return(false);
                }
            }

            //読込位置をリセットする
            lCnf.Reset();
            rCnf.Reset();
            return(true);
        }