Задать вопрос
dsherbakov
@dsherbakov
Студент

Как упростить логическое выражение?

Создал пользовательский тип логического выражения:
-- Тип логического выражения
data Prop =   Var String 
			| Not Prop
			| And Prop Prop
			| Or Prop Prop 
				deriving (Eq, Show)


Вот пример такого выражения:
expr = Or (Var"y") (Or (Var "x") (Not (Var "x")))
Думаю понятно, у меня все максимально упрощенно, без констан, только переменные, и операции, не или и.
Мне необходимо написать функцию для него, чтобы его упростить.
А конкретно учесть двойное отрицание. не (не А) = А
Повторения. А && А = А. А || А = А
И Поглощения. А + А*B = A. A*(A+B) = B
Помогите пожалуйста с такой функцией. На вход выражение и на выходе тоже выражение.
simplifyExpr :: Prop -> Prop
  • Вопрос задан
  • 183 просмотра
Подписаться 1 Средний Комментировать
Решения вопроса 1
@AlexSku
не буду отвечать из-за модератора
можно так:
simplifyExpr (Not (Not p)) = simplifyExpr p -- рекурсивный вызов
-- другие шаблоны

-- конец рекурсии
simplifyExpr p = p

-- проверка
>simplifyExpr (Not (Not (Var "abc")))
Var "abc"
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы