Nano Hash - криптовалюты, майнинг, программирование

Распределить логическое логическое выражение

Что я имею :

(A.B.C) + (D.E) + (F.G.H.I)

Чего я хочу, используя распределительный закон:

(A + D + F).(A + D + G).(A + D + H).(A + D + I).
(A + E + F).(A + E + G).(A + E + H).(A + E + I).
(B + D + F).(B + D + G).(B + D + H).(B + D + I).
(B + E + F).(B + E + G).(B + E + H).(B + E + I).
(C + D + F).(C + D + G).(C + D + H).(C + D + I).
(C + E + F).(C + E + G).(C + E + H).(C + E + I)

Оба выражения эквивалентны. Я использовал распределительный закон, чтобы получить второй: A + (B . C) ⇔ (A + B) . (A + C)

Выражение может быть больше, но оно всегда состоит из групп AND, разделенных OR. Я ищу библиотеку, которая могла бы распределять логические выражения. Библиотека наподобие Sympy, но применяемая к логике, а не к алгебре.

20.09.2017

Ответы:


1

Sympy — идеальный выбор для этого, просто взгляните на модуль logic. , в частности, Equivalent и to_cnf, пример ниже:

from sympy import *

A, B, C, D, E, F, G, H, I = symbols('A,B,C,D,E,F,G,H,I')

formula = (
    (A & B & C) | (D & E) | (F & G & H & I)
)
formula2 = (
    (A | D | F) & (A | D | G) & (A | D | H) & (A | D | I) &
    (A | E | F) & (A | E | G) & (A | E | H) & (A | E | I) &
    (B | D | F) & (B | D | G) & (B | D | H) & (B | D | I) &
    (B | E | F) & (B | E | G) & (B | E | H) & (B | E | I) &
    (C | D | F) & (C | D | G) & (C | D | H) & (C | D | I) &
    (C | E | F) & (C | E | G) & (C | E | H) & (C | E | I)
)

print(to_cnf(formula))
print(Equivalent(to_cnf(formula), formula2))

Результат:

(A | D | F) & (A | D | G) & (A | D | H) & (A | D | I) & (A | E | F) & (A | E | G) & (A | E | H) & (A | E | I) & (B | D | F) & (B | D | G) & (B | D | H) & (B | D | I) & (B | E | F) & (B | E | G) & (B | E | H) & (B | E | I) & (C | D | F) & (C | D | G) & (C | D | H) & (C | D | I) & (C | E | F) & (C | E | G) & (C | E | H) & (C | E | I)
True
20.09.2017
  • вау пропустил все это! Про УНФ и ДНФ даже не знал, очень поучительно. На самом деле то, что я хочу, это DNF в CNF. Спасибо, я посмотрю модуль более подробно. 20.09.2017

  • 2

    Похоже, вы можете сделать это с помощью пакета boolean.py (установите его из Pip с помощью pip install boolean.py):

    from boolean import BooleanAlgebra
    
    exp1 = algebra.parse("(A*B*C) + (D*E) + (F*G*H*I)")
    # Convert to conjunctive normal form (CNF)
    exp2 = algebra.cnf(exp1)
    print(exp2.pretty())
    

    Выход:

    AND(
      OR(
        Symbol('A'),
        Symbol('D'),
        Symbol('F')
      ),
      OR(
        Symbol('A'),
        Symbol('D'),
        Symbol('G')
      ),
      OR(
        Symbol('A'),
        Symbol('D'),
        Symbol('H')
      ),
      OR(
        Symbol('A'),
        Symbol('D'),
        Symbol('I')
      ),
      OR(
        Symbol('A'),
        Symbol('E'),
        Symbol('F')
      ),
      OR(
        Symbol('A'),
        Symbol('E'),
        Symbol('G')
      ),
      OR(
        Symbol('A'),
        Symbol('E'),
        Symbol('H')
      ),
      OR(
        Symbol('A'),
        Symbol('E'),
        Symbol('I')
      ),
      OR(
        Symbol('B'),
        Symbol('D'),
        Symbol('F')
      ),
      OR(
        Symbol('B'),
        Symbol('D'),
        Symbol('G')
      ),
      OR(
        Symbol('B'),
        Symbol('D'),
        Symbol('H')
      ),
      OR(
        Symbol('B'),
        Symbol('D'),
        Symbol('I')
      ),
      OR(
        Symbol('B'),
        Symbol('E'),
        Symbol('F')
      ),
      OR(
        Symbol('B'),
        Symbol('E'),
        Symbol('G')
      ),
      OR(
        Symbol('B'),
        Symbol('E'),
        Symbol('H')
      ),
      OR(
        Symbol('B'),
        Symbol('E'),
        Symbol('I')
      ),
      OR(
        Symbol('C'),
        Symbol('D'),
        Symbol('F')
      ),
      OR(
        Symbol('C'),
        Symbol('D'),
        Symbol('G')
      ),
      OR(
        Symbol('C'),
        Symbol('D'),
        Symbol('H')
      ),
      OR(
        Symbol('C'),
        Symbol('D'),
        Symbol('I')
      ),
      OR(
        Symbol('C'),
        Symbol('E'),
        Symbol('F')
      ),
      OR(
        Symbol('C'),
        Symbol('E'),
        Symbol('G')
      ),
      OR(
        Symbol('C'),
        Symbol('E'),
        Symbol('H')
      ),
      OR(
        Symbol('C'),
        Symbol('E'),
        Symbol('I')
      )
    )
    
    20.09.2017
  • Я должен был выбрать ответ, чтобы принять. Ваш ответ также приемлем. Я предпочитаю использовать Sympy, как предложил @BPL. Большое спасибо за Вашу помощь. 20.09.2017
  • @Dionys Да, я думаю, что ответ Sympy более полезен, поскольку это гораздо более распространенная библиотека (я просто не знал, что в ней также реализована булева алгебра). 20.09.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..