Bilinmeyen bir tamlığın bir programlama dili yazın


91

Bir Dilin Tamamlanıp Olmadığını Belirlemek , bir dil tasarlarken çok önemlidir. Ayrıca, birçok ezoterik programlama dilinin başlaması oldukça zor bir iştir, ancak bunu bir adım daha başlatır. Turing Complete'i ispatlaması zor olan bazı programlama dilleri yapalım, dünyadaki en iyi matematikçiler bile, her iki şekilde de kanıtlayamayacak. Göreviniz, Turing Completeness (Matematik Eksikliği) büyük bir çözülmemiş soruna dayanan bir dil tasarlamak ve uygulamaktır .

kurallar

  • Seçtiğiniz sorunun en az 10 yıl önce ortaya konmuş olması ve bu sorunun gönderilmesinden itibaren çözülmemesi gerekir. Vikipedi sayfasında listelenenlerden sadece biri değil, matematikte kanıtlanabilir herhangi bir varsayım olabilir .

  • Dilin bir tanımını ve mevcut bir dilde bir uygulama sağlamalısınız.

  • Programlama dili, yalnızca program geçerliyse ve tamamlandıysa Turing tamamlanmalıdır. (veya eğer ve varsayım geçerli değilse)

  • Seçilen varsayım temelinde neden Turing'in eksiksiz veya eksik olduğu konusunda bir kanıt içermelisiniz. Tercüman veya derlenmiş programı çalıştırırken sınırsız hafızaya erişim sağlayabilirsiniz.

  • Turing Completeness I / O ile ilgilendiğimiz için gerekli değil, ancak amaç en ilginç dili yapmaktır, böylece yardımcı olabilir.

  • Bu bir yani en çok oy alan cevap kazanacak.

Hedef Kriterleri

İyi bir cevap ne yapmalı? İşte oy verirken aranacak fakat teknik olarak gerekli olmayan bazı şeyler


Bu konuşma sohbete taşındı .
Dennis

13
Genel olarak, cevapları burada hayal kırıklığı yaratan buluyorum. Bunlar "Turing-complete bir dille başla, X varsayımının Doğru / Yanlış olup olmadığını test et ve öyleyse, önemli bir özelliği sonlandır ya da devre dışı bırak."
xnor

1
@xnor Sizinle aynı fikirdeyim, bu ödülün biraz daha ilginç cevaplar getireceğini umuyordum, ancak gerçekleşmeyecek gibi görünüyor.
Buğday Sihirbazı

2
Sorunlardan birinin, çoğu varsayımın sonsuz sayıda değer için doğru olduğu kanıtlanmış olduğunu, ancak karşı örneklerin de sonsuz sayıda değer için geçerli olacağını düşünüyorum. Sonuç olarak, Turing'in bütünlüğünün doğru olduğunu ispatlamak neredeyse imkansız hale geliyor.
f Marnɛtɪk

1
Turing bütünlüğünün, verilen bir varsayımla birebir olarak bağlanması şartının oldukça güçlü bir gereksinim olduğunu düşünüyorum. Turing bütünlüğünün sırasıyla iki farklı açık soruna karar vermesinin kolay olacağını düşünüyorum. (örneğin Turing'in eksiksiz olduğunu kanıtlamak, A problemine ve A problemini çözmeye, B problemine karar verir).
PyRulez

Yanıtlar:


48

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())

14

Birliği kapalı

Bu programlama dili, Birlik-Kapalı Kümeler varsayımının yanlış olması durumunda Tamamlanıyor .

Kontroller

Komutların Listesi:
x ++ Artım x (INC)
x-- Azaltma x (DEC)
j (x, y) Y, komut sırasının sonuna 0 ise komut seti x ekleyin.

Tüm değişkenler 0 olarak başlatıldı.

Sözdizimi

Programlar bir dizi komut olarak yazılır.
Command1 Command2 Command3 ...
Command1 Command2 ...
...

Programın kapalı olup olmadığını belirlemek için, her set sadece
j (x, y)! = J (a, b)
+ (x)! = + (Y) kümesindeki farklı komutların listesini oluşturur.

Herhangi bir komut türü (+, -, j) kümelerin en az yarısında belirirse, hiçbir şey yapmaz.

Talimatlar kuyruğunun sonunda herhangi bir talimat yoksa Programlar sona erebilir

Boş döngü dahil olmak üzere sonsuz döngüler j (x, y) kullanılarak elde edilebilir

tercüman

Tamamlanma Turing

Üç komutun tümü, j (x, y), artırma, azaltma komutlarının tümü kullanılabilir durumda olduğundan, bir Minsky makinesi simüle edilebilir.

J (x, y) kullanılarak erişilen yalnızca j (x, y) içeren herhangi bir küme HALT
x ++, INC x - '
dir DEC
j (x, y) JZ'dir.

Sendika kapalı kümeleri varsayımı doğruysa, üç komuttan en az biri her zaman devre dışı bırakılacak ve bu dilin Turing'in tamamlanmasını imkansız hale getirecektir.


Yapacağım şey 3 operatöre sahip olmak yerine sonsuz sayıda değere sahip olmak ve üç işlemden birini artı no-op almak için her birinin 4 modülünü almak. Program başladığında setlerin birliğinin kapalı olduğunu kontrol eder ve ardından setlerin yarısından fazlasında bulunan elementleri kaldırır. Daha sonra, böyle bir eleman kalmayana kadar bunu tekrar eder. Varsayım doğruysa, tüm programlar boş programla aynıdır, ancak yanlışsa olası her programı (no-op'un dahil edilmesinin nedeni) ifade edebilirsiniz.
Buğday Sihirbazı

@WheatWizard Tercüman tarafından kapatılan birliğin belirlenmesi, aynı operatörü farklı değişkenler üzerinde farklı görür. x ++, y ++ 'dan farklı olarak kabul edilir. Sonuç olarak, yaratılabilecek farklı kümelerin sonsuzluğu vardır. Sonsuz sayıda olası setle, üç ana tipten hiçbiri setlerin yarısından fazla değilse, o zaman tamamlanır.
f Marnɛtɪk

Birlik kapalı kümeleri varsayımına ilişkin bir kanıtın, turlama tamamlandı olarak üç operatörden birine dönüşüm bırakması olasıdır, çünkü programda tüm farklı operatörleri bırakmak mümkün olabilir; kalacak değerler.
f Marnɛtɪk

13

Fermat astarları

Dil, bandın her bir yerinin isteğe bağlı bir tamsayı depolayabileceği, potansiyel olarak sınırsız iki bant üzerinde çalışır. Her iki bant -1başlangıçta doldurulur . Her iki bantta da 0 konumundan başlayan iki bant başlığı vardır.

Tercüman ilk önce girişi okuyacak ve değerleri 0 konumundan başlayarak ilk (veri) kasette saklayacaktır.

Sonra verilen programı okuyacaktır. Karşılaştığı her sayı için, önce değerin bir Fermat üssü olup olmadığını kontrol eder. Eğer öyleyse, Fermat'ın hazırladığı ikinci (talimat) bandına, aksi takdirde -1talimat bandına yazacaktır .

Ardından komut göstergesindeki değeri kontrol edin ve aşağıdakilerden birini yapın:

  • -1 veya daha az: Programdan çık
  • 0: Veri bandı konumunu bir sola kaydırın. Talimat bandı konumunu bir sağa doğru hareket ettirin
  • 1: Veri şeridi konumunu bir sağa kaydırın. Talimat bandı konumunu bir sağa doğru hareket ettirin
  • 2: Veri bandı konumundaki değeri arttırın. Talimat bandı konumunu bir sağa doğru hareket ettirin
  • 3: Veri bandı konumundaki değeri azaltın. Talimat bandı konumunu bir sağa doğru hareket ettirin
  • 4: Geçerli veri bandı konumundaki değer sıfır ise, talimat şeridinde eşleşen 5(veya daha büyük) bir değere veya daha küçük bir değere ulaşana kadar talimat bandını sağa doğru kaydırın 0. Eğer bir 5(veya daha büyükse), talimat işaretçisini bir kez daha sağa, daha küçükse 0programdan çıkın. Geçerli veri bandı konumu sıfır değilse, komut şeridini bir sağa kaydırmanız yeterlidir
  • 5veya daha fazla: Talimat işaretçisini, ilgili 4değere ulaşana veya daha küçük bir şey bulana kadar sola hareket ettirin 0. İkinci durumda, programdan çıkın.

(eşleşerek 5(veya daha fazla) ve 4değerlerle, komut şeridinde doğru değeri ararken ilk komutla aynı değerle karşılaştığında (ya da 5(veya daha fazla) veya 4), uygun sayıyı atlaması gerekeceği anlamına gelir. Aramadaki diğer değerin ( 4veya 5sırasıyla (veya daha fazlasının))

Döngü, talimat programdan çıkmanız gerektiğini söyleyene kadar.

Program sona erdiğinde, veri bandındaki değerleri 0pozisyondan bir -1değer içeren ilk bant pozisyonuna kadar verin .

Kanıt

Dilin, temelde F_5herhangi bir uygun döngüyü yapabilmek için gerekli olduğu , IO'suz bir Brainfuck yorumlayıcısına eşlendiğini unutmayın .

Bununla birlikte, Fermat üssü varsayımına dayanarak, sadece 5 Fermat primi ( F_0- F_4) vardır. Eğer F_5dil var biz Brainfuck Turing-tam olduğunu bildiğimiz gibi, Turing-tamamlandı. Ancak, sensiz F_5ne dallanma ne de döngü yapamazsınız, temelde sizi çok basit programlara kilitlersiniz.

uygulama

(yakut 2.3.1 ile test edilmiştir)

#!/usr/bin/env ruby
require 'prime'

CHEAT_MODE = false
DEBUG_MODE = false
NUM_CACHE = {}

def determine_number(n)
  return n.to_i if CHEAT_MODE
  n = n.to_i
  -1 if n<3

  return NUM_CACHE[n] if NUM_CACHE[n]

  i = 0

  loop do
    num = 2**(2**i) + 1
    if num == n && Prime.prime?(n)
      NUM_CACHE[n] = i
      break
    end
    if num > n
      NUM_CACHE[n] = -1
      break
    end
    i += 1
  end

  NUM_CACHE[n]
end

data_tape = Hash.new(-1)
instruction_tape = Hash.new(-1)

STDIN.read.each_char.with_index { |c,i| data_tape[i] = c.ord }
File.read(ARGV[0]).split.each.with_index do |n,i|
  instruction_tape[i] = determine_number(n)
end

data_pos = 0
instruction_pos = 0

while instruction_tape[instruction_pos] >= 0
  p data_tape, data_pos, instruction_tape, instruction_pos,'------------' if DEBUG_MODE

  case instruction_tape[instruction_pos]
  when 0 then data_pos -= 1; instruction_pos += 1
  when 1 then data_pos += 1; instruction_pos += 1
  when 2 then data_tape[data_pos] += 1; instruction_pos += 1
  when 3 then data_tape[data_pos] -= 1; instruction_pos += 1
  when 4 then
    if data_tape[data_pos] == 0
      count = 1
      instruction_pos += 1
      while count>0 && instruction_tape[instruction_pos] >= 0
        count += 1 if instruction_tape[instruction_pos] == 4
        count -= 1 if instruction_tape[instruction_pos] >= 5
        instruction_pos += 1
      end
      break if count != 0
    else
      instruction_pos += 1
    end
  else
    count = 1
    instruction_pos -= 1
    while count>0 && instruction_tape[instruction_pos] >= 0
      count += 1 if instruction_tape[instruction_pos] >= 5
      count -= 1 if instruction_tape[instruction_pos] == 4
      instruction_pos -= 1 if count>0
    end
    break if count != 0
  end
end

data_pos = 0

while data_tape[data_pos] >= 0
  print data_tape[data_pos].chr
  data_pos += 1
end

Örnekler:

Bu, yeni bir satır ile ekrana H(kısa Hello World!) yazacaktır :

17 17 17 17 17 17 17 17 17 17
17 17 17 17 17 17 17 17 17 17
17 17 17 17 17 17 17 17 17 17
17 17 17 17 17 17 17 17 17 17
17 17 17 17 17 17 17 17 17 17
17 17 17 17 17 17 17 17 17 17
17 17 17 17 17 17 17 17 17 17
17 17 17
5
17 17 17 17 17 17 17 17 17 17
17

Farklı kaydedin example.fermatve bu şekilde çalıştırın (not: her zaman bir giriş yapmanız gerekir):

$ echo -n '' | ./fermat.rb example.fermat

Bu sonraki örnek, girişin her bir değerini birer birer artırarak basit bir Sezar tarzı şifre çözecektir. Belli ki ?5. Fermat üssü ile değiştirmeniz gerekiyor :

17 65537 5 17 ? 257

Hile modunu etkinleştirerek ve 2 4 1 2 5 3kaynak kodu kullanarak çalıştığını deneyebilirsiniz :

$ echo 'Hello' | ./fermat.rb example2_cheat.fermat

2
Ulaşmak için karşılık gelen asal sayıyı yazması gereken zavallı kodlayıcı için üzgünüm 5. Umarım iyi bir klavyeleri vardır.
AdmBorkBork

2
@AdmBorkBork Endişelenme. Sadece evrenin temel parçacıklardan daha fazla bitleri var.
f Marnɛtɪk

@LliwTelracs aslında evrendeki temel parçacıkların miktarı Aleph-null (omega) olduğundan ve omega'dan olduğundan, sayının gerçek boyutu anlamına gelmeyeceği için anlam ifade etmiyor. (Bunlardan biri: P)
Matthew Roh

1
@MatthewRoh Bir hata yaptım. Gözlenebilir evrende demek istedim.
f Marnɛtɪk

2
@MatthewRoh Aslında, sonlu, sonsuz, sayılamayan ve hatta set teorisi ile tutarsız olabilir! Ancak, asla bilemeyeceğiz :(
CalculatorFeline

10

Kırlangıçlar w / Hindistan Cevizi v2

Önceki sürüm bu yarışma için geçersiz kılan hatalara sahip olduğundan ve bu sürüm için önemli ölçüde farklı olan bu sürüm için önceki sürüm sayısından fazla puan almak istemiyorum, bu sürüm yeni bir yayın olarak sunuluyor.

Eğer Collatz Conjecture tüm pozitif tamsayılar için kanıtlanabilirse , bu dil tamamlanmaz . Aksi takdirde, dil Turing tamamlandı.

Bu dil Kardinal'e dayanıyordu .

İlk olarak, programın içeriği,
contVal = sum (toplamın (satırın ASCII değerleri)) * 2 ^ (satır sayısı-1) formülü kullanılarak hesaplanır.

Daha sonra, her A veya E'de zıt yönlerde yönlenen 2 Kırlangıç ​​oluşturulur ve tüm koşullu dönüş ifadeleri başlatma için bekleyecek şekilde ayarlanır.
Bir E'de yaratılan kırlangıçlar sola / sağa yönlenir ve bir A'da yaratılan kırlangıçlar yukarı / aşağı yönlenir.

Son olarak, kod tüm işaretçiler kaldırılıncaya veya contVal bire düşene kadar adımlar uygular.

Her adımda contVal% 2 == 0 ise 2'ye bölünür, aksi takdirde üç ile çarpılır ve bir artırılır.

Komutlar:

0: değeri 0
+ olarak ayarlayın : değeri 1 ile artırın
>: yönü sağdan
değiştirin v: yönü aşağıdan
değiştirin <: yönü sola
değiştirin ^: yönü yukarıdan değiştirin
R: İlk göstergeden sonraki sonraki işaretçiler değeriyle karşılaştırın ilk işaretçi. Eşitse düz gidin, aksi takdirde sağa dönün.
L: İlk işaretçiden sonraki sonraki işaretçiler, ilk işaretçinin değeriyle karşılaştırılır. Eşitse düz gidin, aksi takdirde sola dönün.
E: işaretçi çoğaltın ancak yöne başlık sol ve sağ
C: işaretçi ama başlık yukarı ve aşağı yönlerde çoğaltın
? : Değer 0 ise işaretçiyi kaldırın.

Açıklama:

Eğer Collatz Conjecture tüm pozitif tamsayılar için kanıtlanabilirse, bu dilde çalışan herhangi bir programın süresi sınırlıdır, çünkü contVal her zaman 1'e yaklaşır, böylece programı sonlandırır.

Aksi takdirde, bu dilin aşağıdaki işlevleri yerine getirebileceğini kanıtlamam gerekiyor.

Artış: +
Sabit 0 ile temsil edilir: 0 ile temsil edilir
Değişken erişim: değişkenler seyahat ederken işaretçiler olarak depolanır
İfade birleştirme: işlemlere kat edilen mesafeyi değiştirerek işlemlerin yapıldığı sıra değiştirilebilir
. Döngü için: Bu dilde

E   > V
    ^+R
      +
      A

for loop> 1'e kadar sayılır (loop'a daha fazla kod eklenebilir)

Benzer şekilde, kod

Rv
^<

R döngüsünde ayarlanan koşullu değere eşit olana kadar yapılacaktır.


Sen de beni yendin, ben collatz varsayımında bir şeyler yapacaktım. İyi iş çıkardın, ilginç üzerine. Sadece 1'e yaklaşırlarsa sadece sayıları depolayabilecek bir dil yaratacaktım.
Rohan Jhunjhunwala

Kafam karıştı. Collatz işlevi bunun neresindedir? İkinci bir okumadan, fonksiyonun contValher aşamada uygulandığını söylemek istediğinizi düşünüyorum (ve bu nedenle varsayım doğruysa, sonsuz döngüler yoktur) - ama cevabın hiçbir yerinde açıkça ifade edildiğini görmüyorum. ??
DLosc

Üzgünüm, bunu yaparken yanlışlıkla açıklamamı bir noktada tanımlamamış olduğunu düşünüyorum
fəˈn Martɪk

10

Mükemmellik / Kusur

Vay, bu eğlenceliydi.

Mükemmellik / Kusurluluk yalnızca sonsuz mükemmel sayılar varsa tamamlanır. Varsa, buna Mükemmellik denir ve eğer yoksa, Kusurluluk olarak adlandırılır. Bu gizem çözülene kadar her iki ismi de tutar.

Mükemmel bir sayı, bölenleri sayıya toplayan bir sayıdır, bu yüzden altı mükemmel bir sayıdır çünkü 1+2+3=6.

Mükemmellik / Kusurluluk aşağıdaki fonksiyonlara sahiptir:

Mükemmellik / Kusurluluk, sıfır dizinli bir yığınla yığın temellidir.

Komutlar:

p(x, y): x'i yth pozisyonundaki yığına iter.

z(x, y): x'i yth konumunda yığına iter, daha önce yth konumunda olandan kurtulur

r(x): xth öğesini yığından kaldırır

k(x): yığındaki xth öğesini döndürür

a(x, y): x ve y ekler. Dizelerle kullanıldığında, bunları xy sırasına göre bir araya getirir.

s(x, y): y'yi x'ten çıkarır. dizeleri ile, son len'i (y) x'ten kaldırır.

m(x, y): x ve y ile çarpılır. Dizelerle kullanılırsa, x çarpı y çarpı.

d(x, y): x'i y'ye böler

o(x): x yazdırır

i(x, y): x doğru olarak değerlendirirse, y işlevini çalıştırır

n(): kod bloğunun çağrıldığı sayacı döndürür.

q(): yığının uzunluğunu döndürür

t(): kullanıcı girişi

e(x, y): Eğer x bir tamsayıysa, eğer x ve y aynı değere sahipse, o zaman 1 döndürür, y bir string ise o zaman y'nin uzunluğunu alır. x bir dizge ise, y'yi dizeye dönüştürür ve aynı olup olmadığını denetler ve eğer öyleyse 1 döndürür. Aksi takdirde 0 döndürür.

l(x, y): x, y'den büyükse, o zaman 1 döndürür. Bir dizgi varsa, dizenin uzunluğunu kullanır.

b(): programı durdurur.

c(x, y): x çalışır, sonra y.

Bir Python eşdeğeri elde etmek andiçin iki değeri birlikte çarpın. Bunun için or, değerleri ekleyin ve için notdeğeri 1'den çıkarın. Bu, yalnızca sayı 1'e bölünerek elde edilebilecek değer 1 veya 0 ise işe yarar.

Veri türleri: tam sayılar ve dizeler. Dizeler ile gösterilir ''ve tamsayı olmayan sayılar yuvarlanır.

Sözdizimi:

Kod, on {}sn içindeki iç içe geçmiş fonksiyonlardan oluşur . Örneğin, alacağı bir program girer ve onları olacağını da ekledi yazdırmak için: {o(a(t(), t()))}. Programın arka planında, 0'dan başlayan ve her bir kod bloğunu her çalıştırdığında 1 ile başlayan bir sayaç vardır. İlk kod bloğu 0, vb. On kod bloğu çalıştırıldıktan sonra, altıncı olan sayıcı her mükemmel sayıya ulaştığında çalıştırılır. Programın çalışması için on kod bloğunun tümüne sahip olmanıza gerek yoktur, ancak bir döngü yapmak istiyorsanız 7'ye ihtiyacınız vardır. Daha iyi bu dil nasıl çalıştığını anlamak için, sayacı sayacı mükemmel bir sayı her ulaştığında yazdırır aşağıdaki programı çalıştırın: {}{}{}{}{}{}{o(n())}.

Tercüman burada bulunabilir: repl.it/GL7S/37 . 1'i seçin ve kodunuzu terminale yazın veya kodunuzu code.perfectsekmeye yapıştırın ve çalıştırdığınızda 2'yi seçin. Bunu denediğinde mantıklı olacak.

Turing eksiksizliğinin kanıtı / Turing eksiksizliğinin eksikliği.

Göre bu yazılım mühendisliği yığını değişimi makalesinde , tam bir Turing atlama koşullu tekrarlama bir form var ve okuma veya bellek yazma için bir yol olması gerekir. Yığın biçiminde belleği okuyabilir / yazabilir ve 6. kod bloğunun, sayaç her mükemmel sayıya ulaştığında gerçekleştirilmiş olması nedeniyle döngü oluşturabilir. Sonsuz sayıda mükemmel sayı varsa, süresiz olarak dönebilir ve Turing tamamlanır, aksi halde değildir.

Giriş olarak 1 veya 0 karakterden oluşan 5 karakter alan Kendiliğinden Biten Döngüsel Etiket Çeviricisi:

{p(t(),0)}{(p(t(),0)}{p(t(),0)}{p(t(),0)}{p(t(),0)}{p(0,0)}{c(i(e(k(s(q(),k(0))),0),c(r(q()),i(l(k(0),0),z(s(k(0),1),0)))),i(e(k(s(q(),k(0))),1),c(z(a(k(0),1),0),i(e(k(q()),1),p(k(s(q(),k(0))),1)))))}

Girdi olarak herhangi bir sayıdaki karakteri almak için genişletilebilir. Sonsuz girdi alabilir, ancak yalnızca sonsuz mükemmel sayı varsa!


1
İşlevle paylaşılmadığı için yalnızca yerel olarak döngü oluşturmak için yeni bir değer oluşturabileceğinizi düşünüyorum.
f Marnɛtɪk

3
Durduğundan dolayı TC'ye ait bir kanıtınız yok. Bağlandığınız yazılım mühendisliği makalesi zorlu gereksinimler sağlar, ancak TC yalnızca kontrol edilmesi gereken bir sürü kutu değildir. Bir TC otomatı (bir Minsky Makinesi gibi) uygulamanız veya dilinizin kararsız olduğunu göstermeniz gerekecektir.
Buğday Sihirbazı

2
@WheatWizard Orada bir Bitwise Döngüsel Etiket yorumlayıcısı ekledim. Giriş olarak herhangi bir miktarda karakter alacak şekilde modellenebilir. Muhtemelen sonsuz karakterleri girdi olarak alabilir, ancak yalnızca sonsuz mükemmel sayılar varsa!
Yoldaş SparklePony

2
“On kod bloğu çalıştırıldığında, altıncı sayaç her mükemmel sayıya ulaştığında çalıştırılır.” Yani tercüman doğrudan doğru sayıları doğrudan sayıyor mu? Bunun mücadelenin ruhuna aykırı olduğunu hissediyorum. Asıl dil özelliği çok fazla önemli değil, Turing-complete artı "sadece mükemmel bir sayıya bastığınızda bir adım için koşun" gibi bir şey olabilir.
xnor

10

Tabanlar

Bu programlama dili, Scholz varsayımı doğruysa tamamlanıyor.

Bu dili yazdım çünkü @SztupY Turing'in eksiksiz olması için doğru olduğuna inanan herhangi bir sonuç olmayacağını söylüyordu.

Komut Listesi

+(x)      Increment x (INC)   
-(x)      Decrement x (DEC)  
j(x,y)    Jump to instruction x if y is 0 (JZ)  
x         End program (HALT) 

Bu komutlarla, bu dil bir Minsky makinesini taklit edebilir

tercüman

Bunu çalıştırmamanı şiddetle tavsiye ederim. Ekleme zincirini kontrol etmek için olağanüstü yavaş bir yöntem kullanır.

Turing bütünlüğü

Dil, dilin turing bütünlüğünü değiştirmek için Scholz varsayımına göre kontrol ettiği birçok komut için bir sayaç kullanır.

Eğer Scholz varsayımı doğruysa, bu program tam Sıfır Duraklama durumunda
Artış
Azaltma
Atlama özelliğine sahip normal bir Minsky makinesi gibi çalışır

Bununla birlikte, eğer Scholz varsayımı yanlış ise, sayaç sonunda Scholz düşüncesinin geçerli olmadığı bir değere ulaşacaktır. Dil, Scholz varsayımının yanlış olduğu bir sayıya geldiğinde çıkmak üzere tasarlandığından, bu komutları çalıştırdıktan sonra program her zaman çıkacaktır. Bu nedenle, tüm programların uzunluğu sınırlı olacaktır. Bu, Turing'in eksiksiz olması için dilin şartlarına uymadığından,

"Teyp uzunluğu sabitlenemez, çünkü verilen tanımlamaya uymayacak ve makinenin doğrusal sınırlı bir otomatınkilerle yapabileceği hesaplama aralığını ciddi şekilde sınırlayacaktır",

Scholz varsayımı yanlışsa, dil tam Turing olmaz


1
+1, bu aslında birleşme zorunluluğunu dile zorlaştırıyor, ziyade doğru / yanlış ise, dili öldürmek için yabancı bir şey eklemek
Gryphon

Anlamadım. Sağladığınız komutlar tam olarak bir Minsky makinesini simüle etmeniz için gerekenlerdir, bu yüzden eğer hepsi buysa, diliniz Scholz varsayımından bağımsız olarak tamamlanıyor. Açıklamandaki bir şeyi özlüyor olmalısın.
Nathaniel,

@Nathaniel Turing'in eksiksiz bir diline ilişkin gereksinimlerden biri dilin sonsuz bir döngüde bitmesidir (durma sorunu). Kodum talimatları yürütürken sayılır ve Scholz varsayımı yanlışsa program belirli sayıda talimattan sonra durur.
f Aprnɛtɪk

Evet, ama Scholz varsayımının yanlış olması durumunda neyin durmasına neden olduğunu açıklamayı unuttun. Cevabınıza bir daha bakın - hiç orada değil.
Nathaniel,

@Nathaniel Program tam anlamıyla scholz varsayımında çalışıp çalışmadığını her bir sayıyı kontrol ederek çalışır. Tahminine uymayan bir sayı bulduğunda otomatik olarak çıkar.
f Aprnɛtɪk

9

nişanlı

Palavra Github .

Benioku ve şartname "README.txt" altındaki github'da.

Genel olarak, bir Betrothed programı, uzunlukları ayrı ayrı çift asal çiftler veya nişanlı çiftler olan iki çizgi hattından oluşur (yinelenemez). Program, ikinci satırdaki çiftin ilk satırının "bükülebilir altkümelerini" bularak yürütülür. Bu tür alt kümelerin sayısı, orijinal ikinci satır ile bükülebilir alt kümeler olmadan ikinci satır arasındaki levenshtein mesafesi ile birleştirildiğinde, yürütülecek komutu belirler.

Bu yazının ispatı alıntılanacak:

V. PROOF OF TURING COMPLETENESS

Now, no language can be Turing Complete with bounded program size. Therefore, if Betrothed
is Turing Complete, it must have unbounded program size. Since the lengths of the lines of
a Betrothed program must be twin prime pairs or betrothed pairs, and since both sequences
are unproven to be infinite or finite, Betrothed has unbounded program size if and only if
there are infintie betrothed pairs, there are infinite twin prime pairs, or both.

    Next: to prove that if Betrothed has an unbounded program size, then it is Turing
Complete. I will use the op-codes from the above table to demonstrate key factors of a
Turing Complete language; they are of the form  [index]<[ld]> .

  1. Conditional goto: 6<> 5<>, or if-popjump. This can be used to form a loop.
  2. Inequality to a constant K: 10<K> 
  3. Arbitrarily large variable space: you can use some separator constant C.

    With this, I have sufficient reason to believe that Betrothed is Turing Complete.

4
"Artık sınırlı bir program boyutuyla hiçbir dil Turing Complete olamaz." Bu ifadeyle ilgili kafam karıştı ... Bir yandan sınırlı bir program boyutuyla sınırlı sayıda farklı program yazabileceğimiz, diğer yandan Turing Completeness için ortak bir kanıtlamanın farklı bir tercüman yazdığı doğru. Sınırsız program boyutuna ihtiyaç duymayan Tamamlanmış bir dil ...
Leo

1
Tercümana iletilen programın tercüman koduna konması gerekmez, tercümana girdi olarak verilmesi gerekir
Leo

7
@Leo. Ben (bu dil yok giriş komutuna sahiptir hayal olmasıdır.) Dili TC'yi olabilmesi için de, yorumlayıcı geçirilecek programı kodlamak gerekir ki diyecek tek komutla bir dil düşünün: b. Bu, daha sonra yerleştirildiği gibi bir BF programını yorumlar b+++++.. Ancak programın boyutu 10 karakterle sınırlıdır. BF'yi yorumlayabilse de, bir Turing makinesinin yapabileceği tüm programları hesaplayamaz.
Conor O'Brien

3
@EriktheOutgolfer, probleminizle ilgili asıl sorun, "girdiden aldığı BF programını koyabilir ..." Bunun için, önceki yorumumu, özellikle bu ilk cümleyi okumanızı veya yeniden okumanızı şiddetle tavsiye ediyorum. Eğer dil sadece Girdiyi temel alarak tam Turing ise, herhangi bir girdi olmadan Turing nasıl tamamlanabilir? Bu, dilin Turing'in eksiksiz olması için, programı kodlaması gereken dilin programının kendisidir. Aksi halde, programın girişinde bulunan ve programlamanın geçerli bir yolu olmadığı kodlanan bir kişi bulunur.
Conor O'Brien,

1
Bunun yerleşik bir nokta olduğunu sanmıyorum. Bu Esolang makalesi konuyu tartışıyor. (Ayrıca Turing-complete bir dilde mümkün olan her sonlandırma programını çıktısı alan bir programın çıktısı ile birlikte basıp basmadığına dair bir soru olup olmadığı sorusu vardır ; girdi gerektirmeyen ve son derece uzun bir programla yapılabilir) .)

5

Dostane parite

Bu dil, karşıt paritesi olan dostane herhangi bir sayı olup olmadığına dayanmaktadır .

Komutları

x : End program if not on top line  
+ : increment stored value  
- : decrement stored value  
{ : set next goto x value to current x value
} : goto previous x value set by {  
j : Go down one line if the special value is an amicable number and the
    parity is opposite to the matching number (loops back to top). If the
    special value is not an amicable number and not on the top line, go up
    one line.  

Kontrol akışı

Program başa dönmeden önce art arda soldan sağa doğru döner. Bir "j" ile karşılaşırsa, satırları değiştirip değiştirmeyeceğini belirlemek için değeri kontrol eder. Sayı, eşleşmesinin karşıt paritesine sahip dostane bir sayı ise, bir satır aşağıya doğru gider (başa doğru geri döner), Aksi halde, numara dostane bir sayıysa, zaten en üst sırada değilse bir sıra yukarı çıkar.

Program ancak program, üst satırın dışındaki herhangi bir satırda x değerine ulaştığında sona erebilir.

Tamamlanma Turing

Bu program, ters parite ile bir çift dostane sayı olduğunu varsayarak bir Minsky makinesini simüle etmek için kullanılabilir.

j, {ve}, JZ'yi (r, x) simüle etmek için kullanılabilir, ancak sıfıra karşılık dostane sayıları kontrol eder.
+, INC (r) 'dir
- DEC (r)
x, HALT tir.

İlk satırı bırakamazsanız, x ve} komutları hiçbir şey yapmaz. Bu, programın boş bir program olmadıkça HALT durumuna girememesiyle sonuçlanır. Bu nedenle, Turing bütünlüğünün bir HALT durumu gerektirdiği tanımı altında, dil eksik Turing olacaktır.

tercüman


2

Yeni hat

Yasal Uyarı: Bu biraz karışıklık ve oldukça basit. Bu şimdiye kadar yazdığım ilk dil ve varsayım, anladığım tek dil. Başka bir kullanıcının aynı kişiyle daha uzun bir cevabı olduğunu biliyorum ama yine de yazmaya karar verdim.

Newline'da yazmak için çok zaman ve newlines ( \n) olması gerekir . Bu, Legendre varsayımının doğru olduğu anlamına gelir. Her operatör, n = 1 ile başladığımız Legendre tahmininde bir sayıya düşmek zorundadır. Her bir operatöre sahip olduğunuzda \ n miktarını alırsınız ve bunu Legendre Tahminine takarsınız ve bir sonraki üssünün alacağı aralığı alırsınız. n 'nin düşmesi gerekir. Bu nedenle sizden başlamak \n\niçin o \nzaman bir operatöre geçersiniz, o zaman başka bir operatöre 3 yeni hattayız. Şimdi bir sonraki \n\nadım 5'tir, böylece operatöre son operatör hattının, başlattığımız Legendre varsayımına düşen asıl tutarda doğru miktarda yeni satır olduğundan emin olun.

Sayılar (dizi) değişkenler gibidir. Bir operatör her çalıştığında (sayı kullanan) artar.

+ adds
- subtracts
/ divide
* multiply 
s sqrt
% mod
a push to vars
g sets stack to numbers
q pushes value of stack to numbers
i increment 
d decrement
r stops subtraction at 0
w turns back on subtraction past 0
[ starts loop
] ends loop runs until stack is 0
{ starts loop
} ends loop and loops until loops[ln] is 0
k increment loops

Kurallara uyan sınırsız asallığa sahip olduğumuz sürece, bu dilin sınırlı olmayan bir kaseti vardır.

Minsky makinesi

\n\ng\nr\n\n[\n\nd\n\n\n\n]

Nasıl çalışır:

\n\ng     # the first two newlines are to get to a prime number of newlines (2) then sets the value of stack to the first variable in the array numbers (see code in link)

\nr       # gets to the next number and makes it so subtraction stops at 0

\n\n[     # starts the loop

\n\nd     # decrements stack 

\n\n\n\n] # ends loop

KhanAcademy'de deneyin .


@ Bu sonlu olmayan bellek ile döngü gerekmez
Christopher

Sadece doğruysa çalışır. Şu anda mobil olduğum için
Christopher

Sonsuz belleğiniz olsa bile, yine de sonsuz döngüye girebilmeniz gerekir.
Pavel

Benim döngülerim var. Onları sınırsız hale getirmeye çalışıyor
Christopher

Şu an çöküyorlar
Christopher

2

Taggis

Taggis, etiket sistemlerine dayalı bir dildir .

Taggis en Turing tamlık dayanmaktadır Collatz Sanısı

Sözdizimi

Bir Taggis programının sözdizimi, tamamen boşluklarla ayrılmış tamamen a, b ve c harflerinden oluşan üç dizektir (üretim kuralları).

infaz

Taggis'in tek program durumu aynı üç karakterden oluşan bir dizedir.

Taggis, her adımda mevcut "etiket" in ilk 2 harfinin kaldırıldığı ve bu kısımda yer alan ilk harfin ilgili üretim kuralının sonuna eklenmiş olduğu TS (3, 2) etiket sistemini uygular. Dize

Örneğin, Taggis programı bc a aaa, yinelemelerin karşılık gelen sayıda as ile temsil edildiği ve 3n + 1 adımının (3n + 1) / 2 [1] ile değiştirildiği ve program çıktısına yol açan 3n + 1 problemini uygular :

aaa // 3
  abc
    cbc
      caaa
        aaaaa // 5
          aaabc
            abcbc
              cbcbc
                cbcaaa
                  caaaaaa
                    aaaaaaaa // 8
                      aaaaaabc
                        aaaabcbc
                          aabcbcbc
                            bcbcbcbc
                              bcbcbca
                                bcbcaa
                                  bcaaa
                                    aaaa // 4
                                      aabc
                                        bcbc
                                          bca
                                            aa // 2
                                              bc
                                                a // 1 and halt because we then begin an infinite loop
                                                 HALT

Turing bütünlüğü

Elbette, bu basit sistem Turing'in eksiksizliğini taklit etmek için çok basit görünebilir, ancak 2 sembollü (üniversal makineler içeren bir sınıf) herhangi bir Turing makinesinin baştan kaldırılan 2 karakterden oluşan bir etiket sistemine dönüştürülebileceği anlaşılmaktadır. ve 32 * m üretim kuralları, nerede m Turing makinesindeki eyaletlerin sayısı .

Sadece 2 sembolle bilinen en küçük üniversal Turing makinesi 18 durum kullanır ve bu nedenle karşılık gelen etiket sistemi bir kuyruklu 576 üretim kuralını içerir [2].

Bununla birlikte, 3 üretim ve 2 kaldırılmış sembol içeren tüm etiket sistemleri kümesinin hesaplama sınıfı, Collatz Konjürasyonuna [2] bağlıdır. Collatz Konjektifinin yanlış olduğu kanıtlanırsa, Taggis Turing tamamlandı. Aksi halde, matematikte çözülmeyen bir problemi temel alır, daha küçük bir Turing makinesi bulur.

def taggis(inp, a, b, c):
    current = inp
    seen = set()
    while True:
        seen.add(tuple(current))

        yield current

        head = current[0]

        current = current[2:]

        current.extend([a, b, c][head])

        if tuple(current) in seen:
            return

def parse():
    program = input().split(" ")

    assert len(program) == 3, "There has to be exactly 3 production rules!" 

    productions = []

    for production in program:

        production = [{"a": 0, "b": 1, "c": 2}[x] for x in production]
        productions.append(production)  

    program_input = [{"a": 0, "b": 1, "c": 2}[x] for x in input()]

    k = 0   

    for step in taggis(program_input, *productions):
        print(' ' * k +''.join(['abc'[x] for x in step]))

        k += 2
    print(' ' * (k - 1) + 'HALT')

parse()
  1. Orijinal Collatz fonksiyonuna eşdeğer olan bir garipliğin 3n + 1'i ndaima eşit olacaktır ve bu nedenle bölme otomatik olarak uygulanabilir.

  2. Tag sistemleri ve Collatz benzeri fonksiyonlar, Liesbeth De Mol ,

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.