2

Я хочу включить Quine–McCluskey Algorithm с Composite 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 => MicroSpecification1 и что MicroSpecification4 => MicroSpecification3. Q-M применяется только к упрощению уравнений независимых булевых переменных.

Вы можете переписать ваши требования в терминах последних 20 бит candidate, а затем использовать Q-M, чтобы упростить получившийся хаос уравнений в 22 логических переменных: 20 Младших битах candidate; единственное логическое значение, которое истинно, если задан какой-либо из оставшихся битов в candidate и одно логическое значение, которое истинно, если candidate равно int. Полученное упрощение было бы подходящим для дизайна чипов, но, вероятно, не для каких-либо других целей. Сожалею.

+0

Благодарим вас за разъяснение. Я полагал, что это превратилось бы в нечто, что было бы практически невозможно реализовать в смысле «ООП». – torrho