출력 등과 같은 문장의 전체 정식 게이 1+2=3
, 2+2=2*(1+1)
등
소개
Peano Arithmetic을 알고 있다면이 섹션을 건너 뛸 수 있습니다.
자연수를 정의하는 방법은 다음과 같습니다.
(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
, 그리고 - 첫 번째 규칙을 제외한 목록의 각 식은 규칙 중 하나에 따라 변환하여 이전 식에서 얻을 수 있습니다.
프로그램은 두 개의 유효한 표현식을 input으로 취 하며 , 각 표현식에는 위에서 정의한 숫자, 덧셈, 곱셈 및 괄호가 포함됩니다.
프로그램은 위의 정의가 존재하는 경우 두 표현식이 동일하다는 증명 (위에 정의 된 목록)을 출력합니다.
두 표현식이 같지 않으면 프로그램은 아무것도 출력하지 않습니다.
각 식을 단일 수로 줄일 수 있고 이러한 수를 평등하게 테스트 할 수 있기 때문에 유한 한 단계로 항상 증명 또는 반증이 가능합니다.
입력 표현식이 유효하지 않은 경우 (예 : 불균형 괄호, 숫자가 아닌 숫자 또는 이진이 아닌 연산자) 프로그램은 오류와 함께 종료되거나 예외를 발생 시키며 오류를 인쇄하거나 그렇지 않으면 관찰 가능한 동작 을 생성해야 합니다. 입력이 유효하지만 비 동일되는 경우 .
요약하면, 허용 가능한 입력에 대한 일반 출력은 입력을 포함하여 다음과 같은 규칙에 의해 생성되는 등가의 목록입니다.
(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="###"=(((())))
등 공백는 무관하다.
물론 규칙은 어느 방향 으로든 적용 할 수 있습니다. 프로그램은 사용 된 규칙을 출력 할 필요가 없으며 이전 표현식에 대한 조치로 생성 된 표현식 만 출력합니다.
가장 짧은 코드가 승리합니다.