2

我想將Quine–McCluskey AlgorithmComposite Specification Pattern合併。如何將Quine-McCluskey算法與綜合規範模式結合

首先,讓我們考慮的基本知識,在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; 
    } 
} 

我真的只需要MicroSpecification4和MicroSpecification2了簡化,等效的MacroSpecification IsSatisfiedBy方法。

所以我的問題是,有沒有辦法使用Quine-McCluskey來簡化宏指定IsSatisfiedBy語句從四個規範到兩個規範(或類似的東西)?

這將是很好的必須給綜合規格模式(並且不失一般性)模式設計通常是某種「智能」。

回答

1

你不能使用Quine-McCluskey來做這種簡化,因爲你正在尋找的簡化要求知道MicroSpecification2 => MicroSpecification1MicroSpecification4 => MicroSpecification3。 Q-M僅適用於簡化獨立布爾變量的方程。

你可以重寫規範的candidate最後20位的條款,然後用Q-M,以簡化方程在22個布爾變量所產生的混亂:的candidate的20低位;一個布爾值,如果candidate中的其餘位中的任何一個被設置,則爲真,並且如果candidateint,則該布爾值爲真。由此產生的簡化適用於芯片設計,但可能不適用於其他任何目的。抱歉。

+0

謝謝你的解釋。我認爲這會變成一些在「OOP」意義上不太實際的東西。 – torrho