레전드 르
이 언어는 Legendre의 추측 이 거짓 인 경우에만 Turing-complete 입니다. 즉, n ^ 2와 (n + 1) ^ 2 사이에 소수가없는 정수 n> 0이 있습니다. 이 언어는 Underload에서 영감을 얻지 만, 어떤면에서는 그 언어와는 매우 다릅니다.
Legendre의 프로그램은 일련의 양의 정수로 구성됩니다 (0은 특히 언어의 전체 목적을 무효화하기 때문에 금지됩니다). 각 정수는 Legendre의 기본 명령 또는 잠재적 인 사용자 정의 명령에 해당합니다. 할당 된 명령은 제곱과 다음 정수 사이의 소수 ( OEIS 시퀀스 A014085 와 동일)를 기반으로합니다 .
언어 명령은 스택을 수정하여 임의로 큰 양의 정수를 보유 할 수 있습니다. 스택에 0이 있으면 0이 즉시 제거됩니다. 세부적으로 명령은 다음과 같습니다.
2 (이 명령을 생성하는 가장 작은 정수 : 1) : 프로그램에서 다음 정수를 스택에 넣습니다.
3 (최소 생산 정수 : 4) : 스택에서 최상위 정수를 팝하고 이와 관련된 명령을 실행합니다.
4 (최소 : 6) : 상단 정수를 팝합니다. 1이면 스택에서 최상위 정수를 증가시킵니다.
5 (10) : 상단 두 스택 항목을 교환합니다.
6 (15) : 스택에서 최상위 정수를 줄입니다. 결과가 0이면 0을 팝하고 버립니다.
7 (16) : 스택의 최상위 정수를 복제합니다.
8 (25) : 실행을 중지하고 스택 내용을 인쇄합니다.
이것은 기본 명령 세트이며 루프는 물론 흥미로운 것을 할 수 없습니다. 그러나 Legendre의 추측이 거짓으로 판명 된 경우에만 액세스 할 수있는 다른 명령이 있습니다.
- 0 (알 수 없음) : 스택에서 모든 항목을 제거하고 새로운 기능으로 결합하여 스택의 원래 하단에서 시작하여 상단에서 끝나는 모든 명령을 실행합니다. "명령 번호"와 같은 명령으로 액세스 할 수 있습니다. 프로그램 소스의 다음 정수에 해당하는 것
이 명령에 접근 할 수있는 언어는 Minsky 기계를 시뮬레이션 할 수 있으므로 언어가 Turing-complete가됩니다.
명령 8이 실행되거나 프로그램의 끝에 도달하면 프로그램이 종료되고 스택의 각 정수에 해당하는 (유니 코드) 문자가 인쇄됩니다.
예제 프로그램
1 2 1 3 1 10 4
이 간단한 프로그램은 4 (명령 : 3)를 실행하기 전에 숫자 2, 3, 마지막으로 10을 푸시합니다. 이로 인해 10 (명령 : 5)이 팝업되고 실행되어 2와 3이 바뀝니다.
1 5 3 15 2 1 6 7
이 프로그램은 간접 정수 대 명령 대응을 사용하는 방법을 보여줍니다. 먼저 2 명령을 인코딩하는 세 가지 다른 방법을 사용하여 5를 누른 다음 15와 1을 누릅니다. 그런 다음 1이 팝업되고 결과적으로 15가 16으로 증가하여 최종적으로 실행됩니다. 프로그램은 스택에서 숫자 5의 두 인스턴스로 끝납니다.
1 1 1 5 ? 24 1 15 1 31 ? 31 24 31
이 프로그램은? 명령을 사용하여 0 명령을 사용하는 방법을 보여줍니다. 자리 표시 자 번호로 프로그램은 먼저 함수 9에 '1 5'를 저장하고 함수 9를 실행하기 전에 (24를 사용하여) 10에 '15 31 '을 저장합니다.이 함수는 스택에 5를 푸시하고 0에 도달하여 제거 될 때까지 반복적으로 감소시킵니다. . 그런 다음 프로그램이 중지됩니다.
민스키 기계
Minsky 컴퓨터를 Legendre 코드로 변환하려면 0 명령을 사용해야 합니다. Legendre의 추측이 거짓이 아니면이 명령에 액세스 할 수 없으므로 자리 표시자를 사용 했습니까? 대신에.
모든 Minsky 기계 명령어 라인 이름은 서로 다른 A014085 대응 및 기본 명령어뿐만 아니라 24 (9) 및 31 (10)의 정수를 가져야합니다.
초기화 :
1 1 1 1 ? 24
x INC (A / B) y :
에이:
1 y 1 24 1 ? 1 6 1 1 16 1 24 ? x
비:
1 y 1 24 1 ? 1 10 1 6 1 1 16 1 10 1 24 ? x
x DEC (A / B) yz :
에이:
1 4 1 10 1 15 1 10 1 31 1 1 1 10 1 z 1 1 1 16 1 24 1 31 1 ? 1 24 1 15 1 y 1 6 16 1 24 16 1 ? 1 1 16 1 10 1 1 16 1 24 ? x
비:
1 4 1 10 1 15 1 10 1 31 1 1 1 10 1 z 1 1 1 16 1 24 1 31 1 ? 1 24 1 15 1 10 1 y 1 6 16 1 24 16 1 ? 1 1 16 1 10 1 1 16 1 10 1 24 ? x
x 정지 :
1 25 ? x
최종 프로그램을 만들려면 모든 부품을 추가하고 (x, y, z를 해당 부품으로 대체) 단일 정수를 추가하여 체인의 첫 번째 명령을 시작하십시오. 이것은 Legendre의 추측이 반례에 의해 거짓으로 판명 된 경우에 언어의 튜링 완성도를 증명해야합니다.
통역사
이 인터프리터는 Python (3)으로 작성되었으며 위의 세 가지 예 모두에서 테스트되었습니다. -a /-allowZero 플래그를 사용하여? -f /-file을 사용하여 파일에서 직접 코드를 실행하고 -s /-stackOut을 사용하여 스택을 Python 목록으로 출력합니다. 파일이 제공되지 않으면 인터프리터는 일종의 REPL 모드로 들어가며 --stackOut에 가장 적합합니다.
import sys
import argparse
import io
class I_need_missing(dict): #used to avoid try/except statements. Essentially a dict
def __missing__(self,key):
return None
def appropriate(integer,prev): #returns number of primes between the square of the integer given and the next
return_value = 0
if prev[integer]:
return prev[integer],prev
if integer == "?":
return 0,prev
for i in range(integer ** 2, (integer + 1) ** 2):
t = False
if i > 1:
t = True
for j in range(2,int(i ** 0.5)+1):
t = i/j != round(i/j)
if not t:
break
return_value += t
prev[integer] = return_value
return return_value,prev
def run_command(commandseries,stack,functions,prev): #Runs the appropriate action for each command.
command,prev = appropriate(commandseries.pop(0),prev)
halt = False
if command == 0: #store in given number
functions[appropriate(commandseries.pop(0),prev)[0]] = stack
stack = []
elif command == 2:#push
stack.append(commandseries.pop(0))
elif command == 3:#execute top instruction
commandseries.insert(0,stack.pop())
elif command == 4:#pop, add 1 to new top if popped value was 1
if stack.pop() == 1:
stack[-1] += 1
elif command == 5:#swap top two integers/?
stack[-1],stack[-2] = stack[-2],stack[-1]
elif command == 6:#subtract 1 from top of stack
stack[-1] -= 1
if stack[-1] == 0:
stack.pop()
elif command == 7:#duplicate top of stack
stack.append(stack[-1])
elif command == 8:#halt
halt = True
else:#run custom
try:
commandseries[0:0] = functions[command]
except TypeError:
print("Warning: unassigned function " + str(command) + " is unassigned", file = sys.stderr)
return commandseries,stack,functions,prev,halt
def main(stack,functions,prev):
#Parser for command line options
parser = argparse.ArgumentParser(description = "Interpreter for the Legendre esoteric programming language.")
parser.add_argument("-a","--allowZero", action = "store_true")
parser.add_argument("-f","--file")
parser.add_argument("-s","--stackOut", action = "store_true")
args = parser.parse_args()
allow_zero = bool(args.allowZero)
#Program decoding starts
pre = ""
if not args.file:
pre = input()
if pre == "":
return
else:
pre = open(args.file).read()
mid = pre.split()
final = []
for i in mid:
if i == "?" and allow_zero:
final.append("?")
elif i != 0 or allow_zero: #and allow_zero)
final.append(int(i))
halt = False
#Functional programming at its best
while final and not halt:
final,stack,functions,prev,halt = run_command(final,stack,functions,prev)
#Halting and output
else:
if args.stackOut:
print(stack)
else:
for i in stack:
print(i == "?" and "?" or chr(i),end = "")
print("")
if args.file or halt:
return
else:
main(stack,functions,prev)
if __name__ == '__main__':
main([],I_need_missing(),I_need_missing())