Вам надається набір логічних висловлювань. Ваше завдання полягає в тому, щоб видалити всі, які суперечать іншим, але оптимальним способом (тобто видалити мінімальну кількість висловлювань).
Виклик
Ви напишете програму або функцію, яка приймає в якості списку висловлювань, видаляє мінімальну кількість висловлювань таким чином, що є рішення та виводить решту.
Логіка
Заяви складаються з змінних A-Z та операторів між ними.
Існує 5 операторів : -(не), v(або), ^(і), ->(якщо) і <->(iff).
Таблиця правди:
A | B | -A | AvB | A^B | A->B | A<->B
0 | 0 | 1 | 0 | 0 | 1 | 1
0 | 1 | 1 | 1 | 0 | 1 | 0
1 | 0 | 0 | 1 | 0 | 0 | 0
1 | 1 | 0 | 1 | 1 | 1 | 1
Ці оператори можуть бути об'єднані разом з дужками ():
A | B | -(AvB) | Av(-A) | A^(-A) | (AvB)->(-B)
0 | 0 | 1 | 1 | 0 | 1
0 | 1 | 0 | 1 | 0 | 0
1 | 0 | 0 | 1 | 0 | 1
1 | 1 | 0 | 1 | 0 | 0
Логічні системи складаються з 1 або більше операторів .
Рішення для логічної системи є стан , в якому все заяви одночасно є правдою.
Приклади логічних систем:
AvB
-(A<->B)
(AvB)->(-B)
Єдине рішення - це A = 1, B = 0.
A^B
-(B<->A)
У цього немає рішення ; без поєднання Aі Bобох тверджень є правдивими.
Вхідні дані
Ви отримаєте набір операторів як вхідних даних. Це можна прийняти за допомогою STDIN або аргументів функції, відформатованих у вигляді масиву (у зручному форматі) або нового рядка, розділеного рядком або пробілом.
Виписки будуть мати таку форму (майже - ABNF ):
statement = variable / operation
operation = not-operation / binary-operation
not-operation = "-" operand
binary-operation = operand binary-operator operand
operand = variable / "(" operation ")"
variable = "A"-"Z"
binary-operator = "v" / "^" / "->" / "<->"
Приклади тверджень:
A
Av(-B)
(A<->(Q^C))v((-B)vH)
Вихідні дані
Ви повинні повернути (можливо) зменшений набір висловлювань у точній формі, в якій ви їх отримали. Знову ж таки, список може бути відформатований у вигляді масиву рядків або рядка, розділеного новим рядком або розділеного пробілом.
Правила
- Ви завжди повинні видаляти мінімальну кількість висловлювань. Якщо існує кілька можливих рішень, виведіть одне з них.
- Ви можете припустити, що вхід завжди містить щонайменше 1 вислів і що жодні заяви не повторюються у введенні.
- Ви можете не припускати, що результат завжди містить оператор. (див. приклади)
- Використання стандартних прорізів суперечить тому, що ваша відповідь є дійсною, і одну з них потрібно видалити.
- Це код-гольф , тому найкоротша відповідь у байтах виграє.
Приклади
Вхід:
A^(-A)
Вихід:
(nothing)
Вхід:
A^B A<->(-B) A<->B
Вихід:
A^B A<->B
Вхід:
["AvB","A^B"]
Вихід:
["AvB","A^B"]
(AvB)->-B(AvB)->(-B)
A<->(Q^C))v((-B)vHпюре.