TypeInt

From Esolang
Jump to navigation Jump to search
TypeInt
Designed by User:GUAqwq
Appeared in 2023
Computational class Turing complete
Major implementations Implemented
File extension(s) .ts_

TypeInt is a esolang which is created by User:GUAqwq. The program runs on an unbounded integer type array which is unbounded. It came out while User:GUAqwq was proving the turing completeness of TypeString:

"If there's only one character for this esolang, will it still Turing Complete?"

Overview

We call <some '*'s><int> value or ptr because they acts as a multilevel pointer.

Operation types:

ptr-  : set the value which ptr points to 0

ptr+  : increase the value which ptr points

value; : dynamic label, if there's the same value for more than 2 labels, first one works.

v0 v1 v2? : if v0 == v1 jump to labelv2

TC proof

Basic

Comment

pseudo code:

# blablabla
let a,b,c,d

target:

do nothing but commenting

code:

# for common comment
let for constants declaration (all of them should be replaced into exact integers when compiling)

Add Constant

pseudo code:

*A += n

known:

*A = a , n

target:

*A = a + n

code:

*A+
...(n times)

Set Constant

pseudo code:

*A = n

known:

*A , n

target:

*A = n

code:

*A-

*A+
...(n times)

Jump

pseudo code:

jp a

known:

a

target:

jump to label a.

code:

# a; in somewhere
0 0 a ?

Jump If Equal

pseudo code:

jp a if b==c

known:

a,b,c

target:

jump to label a if b == c

code:

# a; in somewhere
b c a ?

Copy

By copying, we can use side-effecting function freely. In order to avoid side-effects, we default to transfer parameters' copies instead of origins if the function is labeled by "(side-effecting)".

pseudo code:

*A = *B

known:

A,B,*B = n

target:

assign *B to *A

code:

let start,end
*A-
start;
jp end if *A==*B
*A+
jp start
end;

Counting

Increase

pseudo code:

*A++

code:

*A+

Decrease

pseudo code:

*B = *A - 1

caution:

*A have to be greater than 0, or the code won't stop.

code:

let C,start,end
*B = 0
*C = 1
start;
jp end if *A==*C
*B++
*C++
jp start
end;
*C = 0 # clear the temporary variable

Boolean Operation

Value

true := 1
false:= 0

Equal

pseudo code:

*C = (A==B)

code:

let T,end
jp T if A==B
*C = false
jp end
T;
*C = true
end;

Not

pseudo code:

*C = !A

code:

let T,end
jp T if A==true
*C = true
jp end
T;
*C = false
end;

OR

pseudo code:

*C = A | B

code:

let T,end
jp T if A==true
jp T if B==true
*C = false
jp end
T;
*C = true
end;

All Logic Gates

By combining NOT gates and OR gates, we can get all the logic gates we need. Here's my expressions:

a AND b  := a &  b
a NOR b  := a !| b
a NAND b := a !& b
a XOR b  := a ^  b

Condition

Compare

(side-effecting)

known:

*A = a, *B = b

target:

*EQ = (a==b), *GT = (a>b), *LT = (a<b), *A = *B = 0

Code:

let
loop;
jp eq if ((*A==0) & (*B==0))
jp gt if ((*A!=0) & (*B==0))
jp lt if ((*A==0) & (*B!=0))

*A--
*B--
jp loop

eq;
#EQ = true
#GT = false
#LT = false
gt;
#EQ = false
#GT = true
#LT = false
lt;
#EQ = false
#GT = false
#LT = true

if-elif-else & while

pseudo code:

if(a){A}
else if(b){B}
else (c){C}
while(d){D}
break;

code:

let A,B,C,if_end

jp A if a==true
jp B if b==true
jp C

A;
...
jp if_end
B;
...
jp if_end
C;
...
if_end;
let D,loop_end
D;
jp loop_end if d==false
...
jp D
loop_end;

To break, just jump to loop_end

Calculation

Add

(Side-effecting)

pseudo code:

*A += *B

code:

while(*B!=0)
{
    *B--
    *A++
}

Sub

(Side-effecting)

pseudo code:

*A -= *B

code:

while(*B!=0)
{
    *B--
    *A--
}

Mul

(Side-effecting)

pseudo code:

*C = *A * *B

code:

*C = 0
while(*B!=0)
{
    *B--
    *C += *A
}

Pow

(Side-effecting)

pseudo code:

*C = *A ** *B

code:

*C = 1
while(*B!=0)
{
    *B--
    *C *= *A
}

Div

(side-effecting)

pseudo code:

*C = *A / *B

code:

*C = 0
while(*A>=*B){
   *C++
   *A -= *B
}

Mod

(side-effecting)

pseudo code:

*A %= *B

code:

while(*A>=*B){
   *A -= *B
}

Turing Machine

Half-Bounded Tape

For an n-adic number, the ath digit m contributes m * n**a to the total.

For a Half-Bounded Tape, each cell correspond to a certain digit of an integer.

Let *T be a tape where data are all n-valued.

Read

pseudo expression:

*T[a]

expression:

*T/(n**a) % n
Write

pseudo code:

*T[a] = m

code:

*T -= *T[a]
*T += m * (n**a)

Registers

*I:=tape_pointer_register

*S:=state_register

Turing Machine

A Turing machine rule has the following components:

current_state read_symbol write_symbol direction next_state

or

A X Y D B

for short.

Let blank_symbol = 0, starting_state = 0, symbol_set_length = n.

state_amount can be any finite number.

Here's the code for ruleA X Y D B:

if(*S == A){
   if(*T[*I] == X){
       #break when Y:=halt
       *T[*I] = Y
       #*I-- when D:=L
       #*I++ when D:=R
       *S = B
   }
}

To assemble a Turing machine:

let n,T,I,S
while(true)
{
   ...#rule0
   ...#rule1
   ...#rule2
   ...#rule3
   
   ...
}

Congratulations! Now you've successfully proved that TypeInt is Turing complete!

Interpreters