2

Quine–McCluskey AlgorithmComposite Specification Patternに組み込みたいです。

まず、C# の仕様パターンの基本について考えてみましょう。

public interface ISpecification
{
    bool IsSatisfiedBy(object candidate);
    ISpecification And(ISpecification other);
    ISpecification Or(ISpecification other);
    ISpecification Not();
}

 public abstract class CompositeSpecification : ISpecification 
 {
    public abstract bool IsSatisfiedBy(object candidate);

    public ISpecification And(ISpecification other) 
    {
        return new AndSpecification(this, other);
    }

    public ISpecification Or(ISpecification other) 
    {
        return new OrSpecification(this, other);
    }

    public ISpecification Not() 
    {
       return new NotSpecification(this);
    }
}

public class AndSpecification : CompositeSpecification 
{
    private ISpecification One;
    private ISpecification Other;

    public AndSpecification(ISpecification x, ISpecification y) 
    {
        One = x;
        Other = y;
    }

    public override bool IsSatisfiedBy(object candidate) 
    {
        return One.IsSatisfiedBy(candidate) && Other.IsSatisfiedBy(candidate);
    }
}

public class OrSpecification : CompositeSpecification
{
    private ISpecification One;
    private ISpecification Other;

    public OrSpecification(ISpecification x, ISpecification y) 
    {
        One = x;
        Other = y;
    }

    public override bool IsSatisfiedBy(object candidate) 
    {
        return One.IsSatisfiedBy(candidate) || Other.IsSatisfiedBy(candidate);
    }
}

public class NotSpecification : CompositeSpecification 
{
    private ISpecification Wrapped;

    public NotSpecification(ISpecification x) 
    {
        Wrapped = x;
    }

    public override bool IsSatisfiedBy(object candidate) 
    {
        return !Wrapped.IsSatisfiedBy(candidate);
    }
}

ここで、MacroSpecification といくつかの MicroSpecifications があるとします。

public class MacroSpecification : CompositeSpecification
{
    MicroSpecification1 Spec1 = new MicroSpecification1();
    MicroSpecification2 Spec2 = new MicroSpecification2();
    MicroSpecification3 Spec3 = new MicroSpecification3();
    MicroSpecification4 Spec4 = new MicroSpecification4();
    public override bool IsSatisfiedBy (object candidate)
    {
        if (candidate is int)
        {
            return Spec1.And(Spec2).And(Spec3).And(Spec4).IsSatisfiedBy(candidate);
        }
    }
}

public class MicroSpecification1 : CompositeSpecification
{
    public override bool IsSatisfiedBy (object candidate)
    {
        if (candidate is int)
        {
            return (candidate > 100);
        }
        return false;
    }
}

public class MicroSpecification2 : CompositeSpecification
{
    public override bool IsSatisfiedBy (object candidate)
    {
        if (candidate is int)
        {
            return (candidate > 300);
        }
        return false;
    }
}

public class MicroSpecification3 : CompositeSpecification
{
    public override bool IsSatisfiedBy (object candidate)
    {
        if (candidate is int)
        {
            return (candidate < 1000000);
        }
        return false;
    }
}

public class MicroSpecification4 : CompositeSpecification
{
    public override bool IsSatisfiedBy (object candidate)
    {
        if (candidate is int)
        {
            return (candidate < 500000);
        }
        return false;
    }
}

単純化された同等の MacroSpecification IsSatisfiedBy メソッドには、MicroSpecification4 と MicroSpecification2 だけが必要です。

私の質問は、Quine-McCluskey を使用して、マクロ仕様の IsSatisfiedBy ステートメントを 4 つの仕様から 2 つの仕様 (または同等のもの) に単純化する方法はありますか?

複合仕様パターンに (そして一般性を失うことなく) パターン設計全般にある種の「知性」を与えなければならないことは素晴らしいことです。

4

1 に答える 1

1

Quine-McCluskey を使用してその単純化を行うことはできません。探している単純化には、それが既知である必要があるためMicroSpecification2 => MicroSpecification1ですMicroSpecification4 => MicroSpecification3。QM は、独立ブール変数の方程式の単純化にのみ適用されます。

の最後の 20 ビットに関して仕様を書き直してから、candidateQM を使用して、結果として生じる 22 のブール変数の方程式の混乱を単純化できますcandidate。の残りのビットのいずれかcandidateが設定されている場合に true である単一のブール値と、 の場合に true である単一のブールcandidateint。結果として得られる単純化は、チップ設計には適していますが、おそらく他の目的には適していません。ごめん。

于 2013-04-15T00:26:59.770 に答える