Виведіть повний формальний підсумок таких тверджень, як 1+2=3
, наприклад , 2+2=2*(1+1)
тощо.
Інтродукція
Якщо ви знаєте арифметику піано, ви, ймовірно, можете пропустити цей розділ.
Ось як ми визначаємо натуральні числа:
(Axiom 1) 0 is a number
(Axiom 2) If `x` is a number, the `S(x)`, the successor of `x`, is a number.
Звідси, наприклад S(S(S(0)))
, число.
Ви можете використовувати будь-яке еквівалентне представлення у своєму коді. Наприклад, усе це дійсне:
0 "" 0 () !
1 "#" S(0) (()) !'
2 "##" S(S(0)) ((())) !''
3 "###" S(S(S(0))) (((()))) !'''
...
etc
Ми можемо розширити правила, щоб визначити додавання наступним чином.
(Rule 1) X+0 = X
(Rule 2) X+S(Y)=S(X)+Y
Цим ми можемо довести 2 + 2 = 4 наступним чином
S(S(0)) + S(S(0)) = 2 + 2
[Rule 2 with X=S(S(0)), Y=S(0)]
S(S(S(0))) + S(0) = 3 + 1
[Rule 2 with X=S(S(S(0))), Y=0]
S(S(S(S(0)))) + 0 = 4 + 0
[Rule 1 with X=S(S(S(S(0))))
S(S(S(S(0)))) = 4
Ми можемо розширити ці правила для визначення множення наступним чином
(Rule 3) X*0 = 0
(Rule 4) X*S(Y) = (X*Y) + X
Хоча для цього нам потрібно визначити структурну роль дужок.
(Axiom 3) If X is a number, (X) is the same number.
Оператори додавання та множення суворо двійкові, і дужки завжди повинні бути явними. A+B+C
Не добре визначені, але (A+B)+C
і A+(B+C)
є.
Приклад
Тепер нам достатньо довести теорему про множення: 2 + 2 = 2 * 2
2 + 2
(2) + 2
(0 + 2) + 2
((0*2) + 2) + 2
(1*2) + 2
2*2
Вимоги
Доказ того, щоA=B
це список виразів , таких , що:
- у - перших
A
, - останнє є
B
, і - кожен вираз у списку крім першого може бути отриманий від попереднього шляхом перетворення його за одним із правил.
Ваша програма прийме два дійсних вирази як вхідні дані , кожен вираз містить числа, додавання, множення та дужки, як визначено вище.
Ваша програма видасть доказ, перелік, як визначено вище, що два вирази рівні, якщо такий доказ існує.
Якщо два вирази не рівні, ваша програма нічого не видасть.
Доведення або спростування завжди можливо за допомогою обмеженої кількості кроків, оскільки кожен вираз може бути зведений до одного числа, і ці числа можна тривіально перевірити на рівність.
Якщо вхідні вирази недійсні (наприклад, незбалансовані круглі дужки, містять нечислові чи небінарні оператори), то ваша програма повинна вийти з помилкою, викинути виняток, надрукувати помилку чи іншим чином створити певну поведінку, що спостерігається, що відрізняється від випадок, коли дані є дійсними, але нерівними .
Підсумовуючи, нормальний вихід для допустимих входів - це список рівних чисел, включаючи входи, який складається за наступними правилами.
(Axiom 1) 0 is a number
(Axiom 2) If `x` is a number, the `S(x)`, the successor of `x`, is a number.
(Axiom 3) If X is a number, (X) is the same number
(Rule 1) X+0 = X
(Rule 2) X+S(Y)=S(X)+Y
(Rule 3) X*0 = 0
(Rule 4) X*S(Y) = (X*Y) + X
(Rule 5) X = (X) (Axiom 3 expressed as a transformation rule.)
Будь-яке підходяще уявлення чисел в вході і виході допускається, наприклад 0=""=()
, 3="###"=(((())))
і т.д. Прогалини не має значення.
Правила, звичайно, можна застосовувати в будь-якому напрямку. Вашій програмі не потрібно виводити, яке правило використовується, а лише вираз, отриманий його дією на попередній вираз.
Найкоротший код виграє.