PyEDA: преобразование текстовой строки в форму DNF
Я новичок в Python. Я пытаюсь преобразовать текстовую строку в форму DNF с помощью PyEDA. Мой код отлично подходит для этой строки.
X [0] & (X [1] | X [2]) -> Или (И (X[0],X[1]), И (X[0],X[2]))
Но когда я пытаюсь использовать указанную ниже строку, она работает не так, как задумано. Может ли кто-нибудь помочь мне разобраться, что происходит не так?
Благодарность!
строка ввода:
X[0]&(X[1]|X[2])&X[3]|X[0]&X[3]
предполагаемый результат:
or(and(X[0],X[1],X[3]),and(X[0],X[2],X[3]), and(X[0],X[3])
Код:
import pyeda
from pyeda.inter import *
s = 'X[0]&(X[1]|X[2])&X[3]|X[0]&X[3]'
X=exprvars('x',4)
bs = expr(s)
expression = bs.to_dnf()
expression
Токовый выход:
And(X[0], X[3])
1 ответ
Документация to_dnf
функция явно заявляет, что будет:
Вернуть эквивалентное выражение в дизъюнктивной нормальной форме.
В ожидаемом результате вы указываете, что хотите:
or(and(X[0],X[1],X[3]), and(X[0],X[2],X[3]), and(X[0],X[3])
Однако, если вы исследуете это выражение, вы увидите, что последний операнд верхнего конъюнкции на самом деле всегда "вернее", чем первые два. Другими словами, если последний операнд истинен, то первые два также верны. Это означает, что весьor
может быть сведен к третьему операнду.
поскольку to_dnf
только обязан возвращать эквивалентное выражение, вы не можете винить его за такое сокращение, и результат правильный.