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)); }; }; export function draw(M:machine){ let s:string=(null as any); s="";