задача
Ваша задача - написать функцию или программу на языке по вашему выбору, который анализирует пару утверждений и определяет, можно ли сделать вывод из этих утверждений, что свиньи способны летать.
вход
Входные данные представляют собой строку, которую можно прочитать из STDIN, принять в качестве аргумента функции или даже сохранить в файле. Входные данные могут быть описаны с использованием следующего EBNF:
input = statement , {statement};
statement = (("Pigs are ", attribute) | ("Everything that is ", attribute, "is also ", attribute)), ". ";
attribute = [not], ("able to fly" | singleAttribute);
singleAttribute = letter, {letter};
letter = "a" | "b" | "c" | "d" | "e" | "f" | "g"
| "h" | "i" | "j" | "k" | "l" | "m" | "n"
| "o" | "p" | "q" | "r" | "s" | "t" | "u"
| "v" | "w" | "x" | "y" | "z" ;
Пример ввода (см. Дополнительные примеры ниже):
Pigs are green. Everything that is green is also intelligent. Everything that is able to fly is also not intelligent. Pigs are sweet.
Выход
Вывод может быть возвращен вашей функцией, записан в файл или распечатан в STDOUT. Есть 5 различных случаев, которые нужно обработать:
- Данные утверждения являются действительными, последовательными и имеют в качестве логического следствия, что свиньи могут летать. В этом случае вы должны вывести
Yes
. - Данные утверждения являются действительными, последовательными и имеют логическое следствие того, что свиньи не могут летать. В этом случае вы должны вывести
No
. - Из приведенных, действительных и последовательных утверждений нельзя сделать вывод, могут ли свиньи летать или нет. В этом случае вы должны вывести
Maybe
. - Данные утверждения являются действительными, но не последовательными (т.е. в данных утверждениях есть противоречие). Так как ex falso quodlibet , мы решаем выводить
Yes
в этом случае. - Данные утверждения недействительны, то есть они не отформатированы в соответствии с данным EBNF. В этом случае вы можете делать все, что хотите.
Детали
- Вы можете предположить, что данные атрибуты независимы друг от друга. Так, например, свинья может быть молодой и старой, зеленой, красной и синей одновременно, не вызывая каких-либо противоречий. Однако свинья не может быть «зеленой» и «не зеленой» в одно и то же время, это противоречит и должно рассматриваться, как описано в (4).
- Для каждого атрибута предположим, что в юниверсе есть хотя бы один объект (не обязательно свинья), у которого есть данный атрибут, и один объект, у которого его нет.
Пример входов и выходов
Входные данные:
Pigs are green. Everything that is green is also intelligent. Everything that is able to fly is also not intelligent.
Вывод: поскольку свиньи зеленые и, следовательно, умные, а все, что умеет летать, не разумно, свиньи не могут летать. Выход есть No
.
Входные данные:
Pigs are old. Everything that is not able to fly is also not old.
Вывод: если свиньи не могли летать, они также не были старыми. Но так как они старые, вы должны вывести Yes
.
Входные данные:
Everything that is sweet is also not old. Everything that is intelligent is also blue.
Выход: Maybe
.
Входные данные:
Pigs are not able to fly. Everything that is red is also sweet. Everything that is sweet is also not red.
Вывод: хотя первое утверждение подразумевает, что свиньи не могут летать, следующие утверждения противоречат друг другу, и поэтому вывод должен быть Yes
.
Входные данные:
Pigs are very smart. Pigs are able to fly.
Вывод: все, что вы хотите, так как строка не соответствует критериям, указанным выше.
победитель
Это код-гольф , поэтому выигрывает самый короткий правильный ответ (в байтах). Победитель будет выбран через неделю после публикации первого правильного ответа.