- Имя входного файла: стандартный ввод
- Имя выходного файла: стандартный вывод
- Ограничение по времени: 2 секунды
- Ограничение по памяти: 256 мегабайт
На вход вашей программе дается утверждение в следующей грамматике:
〈Файл〉 ::= 〈Выражение〉
〈Выражение〉 ::= 〈Дизъюнкция〉 | 〈Дизъюнкция〉 ‘->’ 〈Выражение〉
〈Дизъюнкция〉 ::= 〈Конъюнкция〉 | 〈Дизъюнкция〉 ‘|’ 〈Конъюнкция〉
〈Конъюнкция〉 ::= 〈Отрицание〉 | 〈Конъюнкция〉 ‘&’ 〈Отрицание〉
〈Отрицание〉 ::= ‘!’ 〈Отрицание〉 | 〈Переменная〉 | ‘(’ 〈Выражение〉 ‘)’
〈Переменная〉 ::= (‘A’ ...‘Z’) {‘A’ ...‘Z’ | ‘0’ ...‘9’ | ‘'’}*
Имена переменных не содержат пробелов. Между символами оператора ‘->’ нет пробелов. В остальных местах пробелы могут присутствовать. Символы табуляции и возврата каретки должны трактоваться как пробелы.
Вам требуется написать программу, разбирающую утверждение и строящую его дерево разбора, и выводящую полученное дерево в единственной строке без пробелов в следующей грамматике:
〈Файл〉 ::= 〈Вершина〉
〈Вершина〉 ::= ‘(’ 〈Знак〉 ‘,’ 〈Вершина〉 ‘,’ 〈Вершина〉 ‘)’
| ‘(!’〈Вершина〉‘)’
| 〈Переменная〉
〈Знак〉 ::= ‘->’ | ‘|’ | ‘&’
〈Переменная〉 ::= (‘A’ ...‘Z’) {‘A’ ...‘Z’ | ‘0’ ...‘9’ | ‘’’}∗
В единственной строке входного файла дано утверждение в грамматике из условия. Размер входного файла не превышает 100 КБ.
В единственной строке выходного файла выведите дерево разбора утверждения без пробелов.
!A&!B->!(A|B)
(->,(&,(!A),(!B)),(!(|,A,B)))
P1'->!QQ->!R10&S|!T&U&V
(->,P1’,(->,(!QQ),(|,(&,(!R10),S),(&,(&,(!T),U),V))))
- Имя входного файла: стандартный ввод
- Имя выходного файла: стандартный вывод
- Ограничение по времени: 1 секунда
- Ограничение по памяти: 256 мегабайт
В данной задаче требуется проверить доказательство выражения в гильбертовском варианте интуиционистского исчисления высказываний и перестроить его в доказательство в натуральном выводе.
На вход дается доказательство утверждения в соответствии со следующей грамматикой:
〈Файл〉 ::= 〈Контекст〉 ‘|-’ 〈Выражение〉 ‘\n’ 〈Строка〉*
〈Контекст〉 ::= 〈Выражение〉 [‘,’ 〈Выражение〉]*
| ‘’
〈Строка〉 ::= 〈Выражение〉 ‘\n’
〈Выражение〉 ::= 〈Выражение〉 ‘&’ 〈Выражение〉
| 〈Выражение〉 ‘|’ 〈Выражение〉
| 〈Выражение〉 ‘->’ 〈Выражение〉
| ‘!’ 〈Выражение〉
| ‘(’ 〈Выражение〉 ‘)’
| 〈Переменная〉
〈Переменная〉 ::= (‘A’ ...‘Z’) {‘A’ ...‘Z’ | ‘0’ ...‘9’ | ‘’’}*
Операторы ‘&’ и ‘|’ левоассоциативны. Оператор ‘->’ правоассоциативен. Операторы в порядке уменьшения приоритета: ‘!’, ‘&’, ‘|’, ‘->’. Имена переменных не содержат пробелов. Между символами одного оператора нет пробелов (‘->’ и ‘|-’). В остальных местах пробелы могут присутствовать. Символы табуляции и возврата каретки должны трактоваться как пробелы.
Если входное доказательство неверно, выведите:
- если строка n доказательства не следует из предыдущих, выведите "Proof is incorrect at line n";
- если последняя строка доказательства отличается от доказываемого утверждения из первой строки, выведите "The proof does not prove the required expression".
- Иначе выведите доказательство. Каждая строка доказательства — узел дерева, пустых строк быть не должно (кроме последней строки). Дочерние узлы указываются перед родительским узлом. В начале строки — уровень узла в квадратных скобках, потом через пробел — формула, в конце строки — обозначение правила, также через пробел и в квадратных скобках. Для обозначения лжи используйте комбинацию "_|_": подчёркивание (ASCII 95), вертикальная черта (ASCII 124), подчёркивание (ASCII 95). В остальном следуйте формату из примеров. Доказанное во входном файле высказывание должно быть заключением самого верхнего правила. В данном высказывании отрицание термов (!φ) передавайте как (φ -> _|_). В доказательстве вы можете пользоваться следующими правилами. Посылки правил должны идти в указанном порядке, переставлять их нельзя — однако, гипотезы в контексте могут быть произвольно переставлены.
Обозначение | Посылки | Заключение |
---|---|---|
Ax |
Γ,φ |- φ |
|
E-> |
Γ |- φ -> ψ, Γ |- φ |
Γ |- φ |
I-> |
Γ,φ |- ψ |
Γ |- φ -> ψ |
I& |
Γ |- φ, Γ |- ψ |
Γ |- φ & ψ |
El& |
Γ |- φ & ψ |
Γ |- φ |
Er& |
Γ |- φ & ψ |
Γ |- ψ |
Il| |
Γ |- φ |
Γ |- φ | ψ |
Ir| |
Γ |- ψ |
Γ |- φ | ψ |
E| |
Γ,φ -> ρ, Γ,ψ -> ρ, Γ |- φ | ψ |
Γ |- ρ |
E_|_ |
Γ |- ⊥ |
Γ |- φ |
A |- A->A
A -> A->A
A
A->A
[3] A,A,A|-A [Ax]
[2] A,A|-A->A [I->]
[1] A|-A->A->A [I->]
[1] A|-A [Ax]
[0] A|-A->A [E->]
A, C |- B’
B’
Proof is incorrect at line 2
Рассмотрим доказательство A -> A
(Гильбертовский стиль).
Входной файл, соответствующий доказательству, мог бы быть таким:
|-A->A
A->A->A
A->(A->A)->A
(A->A->A)->(A->(A->A)->A)->(A->A)
(A->(A->A)->A)->(A->A)
A->A
Поскольку утверждение может быть доказано следующим натуральным выводом:
A->A
A->A
То, соответственно, текст ниже будет корректным ответом на задачу.
[1] A|-A [Ax]
[0] |-A->A [I->]
- Имя входного файла: стандартный ввод
- Имя выходного файла: стандартный вывод
- Ограничение по времени: 1 секунда
- Ограничение по памяти: 256 мегабайт
Напишите программу, проверяющую доказательство в формальной арифметике на корректность.
〈Файл〉 ::= 〈заголовок〉‘\n’〈доказательство〉
〈заголовок〉 ::= ‘|-’〈выражение〉
〈доказательство〉 ::= {〈выражение〉‘\n’}+
〈выражение〉 ::= 〈дизъюнкция〉 | 〈дизъюнкция〉‘->’〈выражение〉
〈дизъюнкция〉 ::= 〈конъюнкция〉 | 〈дизъюнкция〉‘|’〈конъюнкция〉
〈конъюнкция〉 ::= 〈унарное〉 | 〈конъюнкция〉‘&’〈унарное〉
〈унарное〉 ::= 〈предикат〉 | ‘!’〈унарное〉 | ‘(’〈выражение〉‘)’
| (‘@’|‘?’)〈переменная〉.〈выражение〉
〈переменная〉 ::= ‘a’ ...‘z’
〈предикат〉 ::= ‘A’ ...‘Z’
| 〈терм〉‘=’〈терм〉
〈терм〉 ::= 〈слагаемое〉 | 〈терм〉‘+’〈слагаемое〉
〈слагаемое〉 ::= 〈умножаемое〉 | 〈слагаемое〉‘*’〈умножаемое〉
〈умножаемое〉 ::= 〈переменная〉 | ‘(’〈терм〉‘)’
| ‘0’ | 〈умножаемое〉‘’’
Коды символов: символ апострофа (’) — 0x27, вертикальная черта (|) — 0x7c.
Если доказательство корректно, проаннотируйте его. Первая строка должна повторять строку из входного файла, остальные строки доказательства должны быть предварены аннотацией:
[n. Ax. sch. k]
где n — номер выражения, а k — номер схемы аксиом: либо число от 1 до 12, либо A9.[n. Ax. k]
где k — значение от A1 до A8.[n. M.P. k, l], [n. ?-intro k], [n. @-intro k]
— для правил вывода.
Смысл индексов для M.P.
: если доказательство представлено формулами δi, то запись слева означает δl ≡ δk -> δn.
Аннотации перечислены в порядке предпочтения: если выражение может быть обосновано, допустим,
как аксиома A8
или как M.P.
, в ответе должно быть указано Ax. A8
.
- В случае пересечения аксиом/схем указывайте аксиому/схему с минимальным номером; арифметические аксиомы/схемы идут после логических.
- Если выражение может быть получено при помощи одного правила вывода несколькими способами, предпочтение должно отдаваться наиболее ранним ссылкам в лексикографическом порядке: M.P. 1,10 предпочтительнее M.P. 10,1.
- Modus Ponens предпочтительнее правил с кванторами, правило с квантором существования предпочтительнее правила с квантором всеобщности (даже если номер исходной формулы для правила с квантором существования меньше).
- Также, аксиомы предпочтительнее правил вывода.
В выражениях должны быть расставлены все скобки в точности по одному разу (т.е. скобки вокруг всех унарных и бинарных выражений — кроме апострофов). Если доказательство некорректно, выведите одну из следующих строк, в зависимости от типа ошибки. Ваша программа должна находить первое некорректное выражение в доказательстве, и для него указывать тип ошибки с минимальным номером (в соответствии со списком ниже):
- Expression n: variable v occurs free in ?-rule.
- Expression n: variable v occurs free in @-rule.
- Expression n: variable v is not free for term t in ?-axiom.
- Expression n: variable v is not free for term t in @-axiom.
- Expression n is not proved.
- The proof proves different expression.
Все строки доказательства, предшествующие некорректной, должны быть проаннотированы. Столь подробные правила введены для того, чтобы упростить проверяющую программу: ответ сравнивается с эталонным на равенство, будьте внимательны.
|-a+0=a
(((a)+0))=a
(@y.y+0*0’=y)->(?x.@y.x=y)
|-((a+0)=a)
[1. Ax. A5] ((a+0)=a)
Expression 2: variable x is not free for term (y+(0*0’)) in ?-axiom.