증명 2 + 2 = 2 * 2 (및 유사)


12

출력 등과 같은 문장의 전체 정식 게이 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="###"=(((())))등 공백는 무관하다.

물론 규칙은 어느 방향 으로든 적용 할 수 있습니다. 프로그램은 사용 된 규칙을 출력 할 필요가 없으며 이전 표현식에 대한 조치로 생성 된 표현식 만 출력합니다.

가장 짧은 코드가 승리합니다.


답변:


5

펄, 166 + 1 바이트

-p(1 바이트 페널티)로 실행하십시오 .

$r='\((S*)';(@b,@a)=@a;push@a,$_ while+s/\+S/S+/||s/$r\+\)/$1/||s/$r\*\)//||s/$r\*S(S*)/(($1*$2)+$1/||s/$r\)/$1/;$\.=/[^S]./s;$_=$b[-1]eq$a[-1]?join'',@b,reverse@a:""

더 읽기 쉬운 :

                           # 암시 적 : $ _의 입력 줄을 읽습니다.
                           # 우리는 개행을 유지
$ r = '\ ((S *)'; # 우리는이 정규식 조각을 많이 사용합니다.
(@b, @a) = @a; # @를 @a로, @를 빈으로 설정
@a, $ _를 푸시하면서 # 루프를 돌 때마다 @를 $ a에 추가
+ s / \ + S / S + / || # 규칙 2 : "+ S"를 "S +"로 변경
s / $ r \ + \) / $ 1 / || # 규칙 1 : "(X + 0)"을 "X"로 변경
s / $ r \ * \) // || # 규칙 3 : "(X * 0)"을 ""로 변경
s / $ r \ * S (S *) / (($ 1 * $ 2) + $ 1 / || # 규칙 4 : "(X * Y"를 "((X * Y) + X"로 변경)
s / $ r \) / $ 1 /; # 규칙 5 : "(X)를"X "로 변경
$ \. = / [^ S] ./ s; # 우리가 줄 바꿈 문자에 1을 추가하십시오
                           # S 이외의 모든 것을 참조하십시오.
$ _ = $ b [-1] eq $ a [-1]? # @b와 @a가 같은 방식으로 끝나는 경우
  join '', @ b, reverse @ a # 다음에 $ _는 @b가되고 뒤에 @가옵니다.
  : ""# 그렇지 않으면 $ _ 비 웁니다
                           # 암시 적 : 출력 $ _

입력 형식은 단항으로 숫자를의 문자열로 표시하며 S, 별도의 줄에 두 개의 입력이 필요합니다 (각 줄 바꿈과 EOF가 뒤 따른다). 나는 그 질문을 괄호는 문자 그대로 ( ), 덧셈 / 곱셈은 문자 그대로 요구해야한다고 해석했다 + *. 다른 선택을 할 수 있다면 이스케이프를 줄임으로써 몇 바이트를 절약 할 수 있습니다.

이 알고리즘은 실제로 첫 번째 입력 행을 빈 행과 비교하고 두 번째 행은 첫 번째 행과 세 번째 행과 두 번째 행 등을 비교합니다. 이것은 질문의 요구 사항을 충족시킵니다. 다음은 예제 실행입니다.

내 입력 :

(SS + SS)
(SS * SS)

프로그램 출력 :

(SSS + S)
(SSSS +)
SSSS
SSSS
(SSSS +)
((SS +) SS +)
(((SS *) SS +) SS +)
(((SS *) S + S) SS +)
(((SS *) + SS) SS +)
((SS * S) SS +)
((SS * S) S + S)
((SS * S) + SS)

SSSS중간에 복제 된 것은 성가 시지만 사양을 위반하지 않기로 결정했으며 남겨 둘 바이트가 적습니다.

잘못된 입력 1에서 줄 바꿈 문자를 추가 하므로 1출력 끝에 흩어져 있습니다.


echo -e "((SS+)+(S+S))\nSS*SS" | perl -p /tmp/x.pl출력 1.
spraff

맞습니다. 두 번째 줄에 괄호가 빠져 있습니다 (라고해야합니다 (SS*SS)). "더하기와 곱하기 연산자는 엄격하게 이진수이므로 괄호는 항상 명시 적이어야합니다."
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.