xxxxxxxxxx
;; Universal Turing Machine Simulation
;; A wax feature demo
; enums for shift directions
(@define STAY 0)
(@define LEFT 1)
(@define RIGHT 2)
; datastructure for the transition function
(struct transition
(let q_curr int) ; current state
(let q_targ int) ; target state
(let sym_r int) ; read symbol
(let sym_w int) ; write symbol
(let shift int) ; shift direction
)
; datastructure for the turing machine
; (map int int) is used to represent the tape,
; mapping position to symbol, to simulate "infinite" length.
; tmin/tmax are tape extremas for visualization
(struct machine
(let state int) ; current state
(let head int)
(let tape (map int int))
(let tmin int) ; leftmost visited tape position
(let tmax int) ; rightmost visited tape position
)
; simulate the turing machine for 1 step.
(func step
(param M (struct machine))
(param D (arr (struct transition)))
(let tape (map int int) (get M tape))
; check each transition function, to see if conditions apply
(for i 0 (< i (# D)) 1 (do
(if (&&
(= (get M state) (get D i q_curr))
(= (get tape (get M head)) (get D i sym_r ))
) (then
; execute the transition
(set tape (get M head) (get D i sym_w ))
(set M state (get D i q_targ))
(if (= (get D i shift) @LEFT) (then
(set M head (- (get M head) 1))
)(else(if (= (get D i shift) @RIGHT) (then
(set M head (+ (get M head) 1))
))))
(break)
xxxxxxxxxx
/*****************************************
* turing *
*****************************************/
/* Compiled by WAXC (Version Mar 2 2021)*/
module turing{
/*=== WAX Standard Library BEGIN ===*/
const w_slice=(x:Array<any>|string,i:number,n:number)=>x.slice(i,i+n);
/*=== WAX Standard Library END ===*/
/*=== User Code BEGIN ===*/
export class transition{
q_curr:number=0;
q_targ:number=0;
sym_r:number=0;
sym_w:number=0;
shift:number=0;
};
export class machine{
state:number=0;
head:number=0;
tape:Record<number,number>=(null as any);
tmin:number=0;
tmax:number=0;
};
export function step(M:machine,D:Array<transition>){
let tape:Record<number,number>=(null as any);
tape=((M).tape);
for(let i:number=(0);Number((i)<(D.length));i+=(1)){
if(((Number((((M).state))==(((((D)[i])).q_curr))))&&(Number((((tape)[((M).head)]??0))==(((((D)[i])).sym_r)))))){
((tape)[((M).head)]=((((D)[i])).sym_w));
((M).state=((((D)[i])).q_targ));
if(Number((((((D)[i])).shift))==(1))){
((M).head=((((M).head))-(1)));
}else{
if(Number((((((D)[i])).shift))==(2))){
((M).head=((((M).head))+(1)));
};
};
break;
};
};
if(Number((((M).head))<(((M).tmin)))){
((M).tmin=((M).head));
};
if(Number((((M).head))>(((M).tmax)))){
((M).tmax=((M).head));
};
};