Legendre
Bu dil yalnızca Turing-tamamlayıcısıdır ve yalnızca Legendre'nin varsayımı yanlışsa, yani n> 0 tamsayısı varsa, öyle ki, n ^ 2 ile (n + 1) ^ 2 arasında bir astar bulunmaz. Bu dil Underload'dan ilham alıyor, ancak bazı açılardan ondan çok farklı.
Legendre'deki programlar bir dizi pozitif tamsayıdan oluşur (0 özellikle yasaklanmıştır çünkü dilin bütün amacını olumsuzlar). Her bir tamsayı, Legendre'deki bir temel komuta veya kullanıcı tarafından tanımlanmış bir potansiyele karşılık gelir. Hangi komutun atandığı, karesi ile bir sonraki tamsayı arasındaki asal sayıları temel alır ( OEIS dizisi A014085'e eşdeğer ).
Dilin komutları, keyfi olarak büyük pozitif tamsayıları tutabilen bir yığını değiştirir. Yığın 0 tutarsa, hemen kaldırılır. Ayrıntılı olarak, komutlar:
2 (bu komutu üreten en küçük tamsayı: 1): Programdaki bir sonraki tamsayıyı yığına itin.
3 (en küçük üretici tamsayı: 4): Yığındaki üst tamsayıyı açın ve bununla ilişkili komutu yürütün.
4 (en küçük: 6): En iyi tamsayıyı seçin. 1 ise, yığındaki üst tamsayıyı artırın.
5 (10): En üstteki iki yığın öğesini değiştirin.
6 (15): Yığındaki üst tamsayıyı azaltın. Bu 0 ile sonuçlanırsa, 0'ı açın ve atın.
7 (16): Yığındaki üst tamsayıyı çoğalt.
8 (25): İşlemi durdurun ve yığın içeriğini yazdırın.
Bu, ilginç bir şey yapamayan temel komut setidir, tek başına döngü. Ancak, yalnızca Legendre'nin varsayımı yanlış olduğunu kanıtlarsa erişilebilir olan başka bir komut vardır.
- 0 (bilinmeyen): Yığındaki tüm öğeleri kaldırın ve bunları yeni bir işleve birleştirin; bu, yığının orjinal dibinden başlayıp en üste biten tüm komutları çalıştıracak ve "komut numarası" na eşit olan bir komut olarak erişilebilir program kaynağındaki bir sonraki tamsayıya tekabül eden.
Bu komut bir şekilde erişilebilirse, dil bir Minsky makinesini taklit edebildiği için, Turing-complete olur.
8 komutu çalıştırıldığında veya programın sonuna ulaşıldığında, program sonlandırılır ve yığındaki her bir tam sayıya karşılık gelen (Unicode) karakteri yazdırılır.
Örnek programlar
1 2 1 3 1 10 4
Bu basit program, 2 (3: komut) 5'in çalıştırılmasını ve 2 ve 3'lerin değiştirilmesini sağlayan bir 4 (komut: 3) çalıştırılmadan önce 2, ardından 3 ve son olarak 10 sayısını iter.
1 5 3 15 2 1 6 7
Bu program dolaylı-tamsayı-komuta yazışmalarının kullanımını gösterir. İlk önce, 5 komutunu, ardından 2 komutunu kodlamanın üç farklı yolunu kullanarak 15 ve 1 tuşlarına basılır. Ardından, 1 atılır ve sonuç olarak, 15 bir 16'ya çıkarılır ve sonunda yürütülür. Program, yığında 5 numarasının iki örneği ile sona erer.
1 1 1 5 ? 24 1 15 1 31 ? 31 24 31
Bu program 0 komutunun kullanımını gösterir. yer tutucu numarası olarak. Program önce işlev 9'da '1', daha sonra 10'a '15 31', işlev 9'u çalıştırmadan önce (24'ü kullanarak), 5'i istifin üzerine iter ve tekrar tekrar 0'a erişene ve kaldırılıncaya kadar azaltır. . Ardından, program durur.
Minsky makinesi
Legendre koduna Minsky makinesini dönüştürmek amacıyla, 0 komut gerekir kullanılabilir. Legendre'nin varsayımı yanlış olmadığı sürece bu komuta erişilemediğinden, yer tutucu kullandım mı? yerine.
Tüm Minsky makine komut satırı isimlerinin birbirinden ve temel komutların yanı sıra 24 (9) ve 31 (10) 'dan farklı A014085 yazışmalarına sahip tamsayılara sahip olması gerektiğini unutmayın.
Başlatma:
1 1 1 1 ? 24
x INC (A / B) y:
C:
1 y 1 24 1 ? 1 6 1 1 16 1 24 ? x
B:
1 y 1 24 1 ? 1 10 1 6 1 1 16 1 10 1 24 ? x
x DEC (A / B) yz:
C:
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
B:
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 HALT:
1 25 ? x
Son programı oluşturmak için tüm parçaları (x, y, z ile karşılık gelenleri ile değiştirin) ekleyin ve zincirdeki ilk komutu başlatmak için tek bir tamsayı ekleyin. Bu, Legendre'nin varsayımının, örneklem tarafından yanlış olduğu kanıtlanmış olması durumunda dilin Turing'in eksiksiz olduğunu kanıtlamalıdır.
tercüman
Bu tercüman Python'da (3) yazılmıştır ve yukarıdaki üç örnekte de test edilmiştir. İzin vermek için -a / - allowZero flaglarını kullanın. kullanılacak, -f / - dosya doğrudan bir dosyadan kod çalıştırmak için ve -s / - stackOut yerine yığının bir Python listesi olarak çıktısını alın. Dosya verilmezse, yorumlayıcı en iyi --stackOut ile kullanılan bir tür REPL moduna girer.
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())