diff options
Diffstat (limited to 'mc')
| -rw-r--r-- | mc/n.lyx | 14 | ||||
| -rw-r--r-- | mc/n4.lyx | 1175 |
2 files changed, 1189 insertions, 0 deletions
@@ -278,5 +278,19 @@ filename "n3.lyx" \end_layout +\begin_layout Chapter +Decidibilidad +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand input +filename "n4.lyx" + +\end_inset + + +\end_layout + \end_body \end_document diff --git a/mc/n4.lyx b/mc/n4.lyx new file mode 100644 index 0000000..59146b8 --- /dev/null +++ b/mc/n4.lyx @@ -0,0 +1,1175 @@ +#LyX 2.3 created this file. For more info see http://www.lyx.org/ +\lyxformat 544 +\begin_document +\begin_header +\save_transient_properties true +\origin unavailable +\textclass book +\begin_preamble +\input{../defs} +\end_preamble +\use_default_options true +\maintain_unincluded_children false +\language spanish +\language_package default +\inputencoding auto +\fontencoding global +\font_roman "default" "default" +\font_sans "default" "default" +\font_typewriter "default" "default" +\font_math "auto" "auto" +\font_default_family default +\use_non_tex_fonts false +\font_sc false +\font_osf false +\font_sf_scale 100 100 +\font_tt_scale 100 100 +\use_microtype false +\use_dash_ligatures true +\graphics default +\default_output_format default +\output_sync 0 +\bibtex_command default +\index_command default +\paperfontsize default +\spacing single +\use_hyperref false +\papersize default +\use_geometry false +\use_package amsmath 1 +\use_package amssymb 1 +\use_package cancel 1 +\use_package esint 1 +\use_package mathdots 1 +\use_package mathtools 1 +\use_package mhchem 1 +\use_package stackrel 1 +\use_package stmaryrd 1 +\use_package undertilde 1 +\cite_engine basic +\cite_engine_type default +\biblio_style plain +\use_bibtopic false +\use_indices false +\paperorientation portrait +\suppress_date false +\justification true +\use_refstyle 1 +\use_minted 0 +\index Index +\shortcut idx +\color #008000 +\end_index +\secnumdepth 3 +\tocdepth 3 +\paragraph_separation indent +\paragraph_indentation default +\is_math_indent 0 +\math_numbering_side default +\quotes_style french +\dynamic_quotes 0 +\papercolumns 1 +\papersides 1 +\paperpagestyle default +\tracking_changes false +\output_changes false +\html_math_output 0 +\html_css_as_file 0 +\html_be_strict false +\end_header + +\begin_body + +\begin_layout Standard +\begin_inset Note Comment +status open + +\begin_layout Plain Layout +Podemos describir máquinas de Turing con un pseudocódigo como el siguiente: +\end_layout + +\begin_layout Plain Layout +\begin_inset Formula +\begin{align*} +\text{<<stmts>>}\to & \text{<<stmt-elem>>}\mid\text{<<stmt-elem>>}\text{<<stmts>>}\\ +\text{<<stmt-elem>>}\to & \text{<<maybe-label>>}\text{<<stmt>>}\mathtt{;}\\ +\text{<<maybe-label>>}\to & \text{<<label>>}\mathtt{:}\mid\\ +\text{<<stmt>>}\to & \mathtt{left}\text{<<tape>>}\mid\mathtt{right}\text{<<tape>>}\mid\mathtt{return}\text{<<tape>>}\mid\mathtt{accept}\mid\mathtt{reject}\mid\\ + & \mid\mathtt{write}\text{<<expr>>}\text{<<tape>>}\mid\text{<<varname>>}\gets\text{<<expr>>}\mid\\ + & \mid\mathtt{if}\text{<<cond>>}\text{<<braced>>}\mid\mathtt{while}\text{<<cond>>}\text{<<braced>>}\mid\\ + & \mid\mathtt{goto}\text{<<label>>}\mid\mathtt{choose}\text{<<braced-exprs>>}\\ +\text{<<tape>>}\to & \text{<<tape-name>>}\mid\\ +\text{<<braced>>}\to & \mathtt{\{}\text{<<stmts>>}\mathtt{\}}\\ +\text{<<braced-exprs>>}\to & \text{<<braced>>}\mid\text{<<braced>>}\mathtt{,}\text{<<braced-exprs>>} +\end{align*} + +\end_inset + +Aquí, +\family typewriter +choose +\family default + ejecuta una de las opciones de forma no determinista, +\begin_inset Quotes cld +\end_inset + +tape +\begin_inset Quotes crd +\end_inset + + por defecto se refiere a la cinta 1, y y +\begin_inset Quotes cld +\end_inset + +expr +\begin_inset Quotes crd +\end_inset + + y +\begin_inset Quotes cld +\end_inset + +cond +\begin_inset Quotes crd +\end_inset + + se refieren, respectivamente, a expresiones que se refieren a un símbolo + y proposiciones lógicas en función de las variables y de +\begin_inset Formula $*=*_{1},*_{2},\dots,*_{k}$ +\end_inset + +, los símbolos en la posición actual de cada cinta. +\end_layout + +\begin_layout Plain Layout +Se puede programar una +\begin_inset Formula $\text{MT}$ +\end_inset + + para que simule a otras. + Para ello, +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +Simulación +\end_layout + +\begin_layout Standard +Consideremos un lenguaje de programación +\begin_inset Quotes cld +\end_inset + +Micro LISP +\begin_inset Quotes crd +\end_inset + + cuya gramática es la siguiente: +\begin_inset Note Note +status open + +\begin_layout Plain Layout +TODO +\end_layout + +\end_inset + + +\begin_inset Formula +\begin{align*} +\text{<<expr>>}\to & (\text{<<name>>}=\text{<<expr>>}\mathtt{.})^{*}\text{<<expr1>>}\\ +\text{<<expr1>>}\to & \mathtt{fn}\mathtt{(}\text{<<name>>}^{*}\mathtt{)}\text{<<expr>>}\mid\text{<<expr2>>}\\ +\text{<<expr2>>}\to & \text{<<name>>}\mid\text{<<literal>>}\mid\text{<<expr2>>}\mathtt{(}(\text{<<expr>>}(\mathtt{,}\text{<<expr>>})^{*})?\mathtt{)}\mid\\ + & \mid\mathtt{(}\text{<<expr>>}\mathtt{->}\text{<<expr>>}(\text{;}\text{<<expr>>}\mathtt{->}\text{<<expr>>})^{*}\mathtt{)}\mid\\ + & \mid\mathtt{\{}\text{<<expr>>}(\mathtt{;}\text{<<expr>>})^{*}\mathtt{\}}\\ +\text{<<literal>>}\to & \text{<<atom>>}\mid\mathtt{[}\text{<<literal>>}^{*}(.\text{<<literal>>})?\mathtt{]} +\end{align*} + +\end_inset + + +\begin_inset Note Note +status open + +\begin_layout Plain Layout +Note: better if functions are not in pairs +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Un +\begin_inset Quotes cld +\end_inset + +atom +\begin_inset Quotes crd +\end_inset + + es un símbolo en una estructura del lenguaje, representado con letras mayúscula +s; +\begin_inset Formula $\mathtt{[}a\mathtt{.}b\mathtt{]}$ +\end_inset + + representa un par +\begin_inset Formula $(a,b)$ +\end_inset + +, donde +\begin_inset Formula $a$ +\end_inset + + y +\begin_inset Formula $b$ +\end_inset + + son átomos u otros pares, +\begin_inset Formula $\mathtt{[}a_{1}\cdots a_{n-1}\text{.}a_{n}\mathtt{]}$ +\end_inset + + equivale a +\begin_inset Formula $\mathtt{[}a_{1}\mathtt{[}a_{2}\mathtt{[}\cdots\mathtt{[}a_{n-1}\mathtt{.}a_{n}\mathtt{]}\cdots\mathtt{]]]}$ +\end_inset + +, y si se omite +\begin_inset Formula $\mathtt{.}a_{n}$ +\end_inset + + se entiende que +\begin_inset Formula $a_{n}=\mathtt{NIL}$ +\end_inset + +. + Hay una pila de variables y un +\begin_inset Quotes cld +\end_inset + +name +\begin_inset Quotes crd +\end_inset + + representa la variable con dicho nombre más arriba de la pila, y se representa + con letras minúsculas. + Una expresión +\begin_inset Formula $\mathtt{fn(}n_{1}\cdots n_{k}\mathtt{)}{\cal E}$ +\end_inset + + es una función +\begin_inset Formula $f$ +\end_inset + + que, al ejecutarse con +\begin_inset Formula $f(e_{1},\dots,e_{k})$ +\end_inset + +, evalúa +\begin_inset Formula $e_{1},\dots,e_{k}$ +\end_inset + + para obtener +\begin_inset Formula $v_{1},\dots,v_{k}$ +\end_inset + + y evalúa +\begin_inset Formula ${\cal E}$ +\end_inset + + con las variables +\begin_inset Formula $n_{1}=e_{1},\dots,n_{k}=e_{k}$ +\end_inset + + en la pila. + Una expresión +\begin_inset Formula $n\mathtt{=}{\cal E}\mathtt{.}{\cal F}$ +\end_inset + + evalúa +\begin_inset Formula ${\cal E}$ +\end_inset + + para obtener +\begin_inset Formula $v$ +\end_inset + + y ejecuta +\begin_inset Formula ${\cal F}$ +\end_inset + + con +\begin_inset Formula $n=v$ +\end_inset + + en la pila. + La expresión +\begin_inset Formula $\mathtt{(}p_{1}\to e_{1},\dots,p_{n}\to e_{n}\mathtt{)}$ +\end_inset + + evalúa +\begin_inset Formula $p_{1}$ +\end_inset + +, si esto devuelve algo distinto de +\begin_inset Formula $\mathtt{NIL}$ +\end_inset + +, evalúa +\begin_inset Formula $e_{1}$ +\end_inset + + y devuelve el resultado, en otro caso evalúa +\begin_inset Formula $p_{2}$ +\end_inset + +, etc., y si todos los +\begin_inset Formula $p_{i}$ +\end_inset + + evalúan a +\begin_inset Formula $\mathtt{NIL}$ +\end_inset + +, devuelve +\begin_inset Formula $\mathtt{NIL}$ +\end_inset + +. + Finalmente, +\begin_inset Formula $\mathtt{\{}e_{1};\dots;e_{n}\mathtt{\}}$ +\end_inset + + devuelve el resultado de evaluar uno de los +\begin_inset Formula $e_{i}$ +\end_inset + + de forma no determinista para que la evaluación de la expresión principal + no devuelva +\begin_inset Formula $\mathtt{NIL}$ +\end_inset + + si esto es posible. +\end_layout + +\begin_layout Standard +Existen 4 funciones primitivas: +\family typewriter +car +\family default +, que toma un par +\begin_inset Formula $\mathtt{[}a\mathtt{.}b\mathtt{]}$ +\end_inset + + y devuelve +\begin_inset Formula $a$ +\end_inset + +, +\family typewriter +cdr +\family default +, que toma un par +\begin_inset Formula $\mathtt{[}a\mathtt{.}b\mathtt{]}$ +\end_inset + + y devuelve +\begin_inset Formula $b$ +\end_inset + +, +\family typewriter +cons +\family default +, que toma átomos o pares +\begin_inset Formula $a$ +\end_inset + + y +\begin_inset Formula $b$ +\end_inset + + y devuelve +\begin_inset Formula $\mathtt{[}a\mathtt{.}b\mathtt{]}$ +\end_inset + +, +\family typewriter +atom +\family default +, que devuelve +\begin_inset Formula $\mathtt{NIL}$ +\end_inset + + si su parámetro es un par o +\begin_inset Formula $\mathtt{T}$ +\end_inset + + si era un átomo, y +\family typewriter +eq +\family default +, que recibe 2 átomos y devuelve +\begin_inset Formula $\mathtt{T}$ +\end_inset + + si son el mismo o +\begin_inset Formula $\mathtt{NIL}$ +\end_inset + + si no. + Añadimos las funciones +\family typewriter +accept +\family default + que acepta y +\family typewriter +reject +\family default + que rechaza. +\end_layout + +\begin_layout Standard +\begin_inset Note Comment +status open + +\begin_layout Plain Layout +La idea es construir un simulador de máquina de Turing con esto. +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Un programa recibe una entrada +\family typewriter +input +\family default +, una cadena dada por una lista de átomos, que acepta si devuelve algo distinto + de +\begin_inset Formula $\mathtt{NIL}$ +\end_inset + + y rechaza si devuelve +\begin_inset Formula $\mathtt{NIL}$ +\end_inset + +. +\end_layout + +\begin_layout Standard +\begin_inset Formula $\text{MicroLisp}\equiv\text{MT}$ +\end_inset + +, y existe una +\begin_inset Formula $\text{MT}$ +\end_inset + + que reconoce +\begin_inset Formula $K\coloneqq\{\langle{\cal A},w\rangle:\text{la MT \ensuremath{{\cal A}} acepta \ensuremath{w}}\}$ +\end_inset + +. +\end_layout + +\begin_layout Itemize +\begin_inset Argument item:1 +status open + +\begin_layout Plain Layout +\begin_inset Formula $\preceq]$ +\end_inset + + +\end_layout + +\end_inset + +El alfabeto de la cinta es el de la entrada más los nombres de las variables, + los de los átomos, un símbolo por cada aparición en el programa de una + evaluación de una función, uno por cada función, tantos símbolos +\begin_inset Formula $s_{1},\dots,s_{n}$ +\end_inset + + como el máximo de argumentos a una función y los símbolos +\begin_inset Formula $\$,\#,\mathcircumflex,s_{0}$ +\end_inset + +. + Los átomos y funciones se representan por sí mismos, un par +\begin_inset Formula $\mathtt{[}a\mathtt{.}b\mathtt{]}$ +\end_inset + + por +\begin_inset Formula $\mathcircumflex ab$ +\end_inset + +, una función por el símbolo que la representa seguido de los nombres de + las variables, y una asignación de variable +\begin_inset Formula $n=u$ +\end_inset + + por +\begin_inset Formula $nu\#$ +\end_inset + +. + Al principio se cambia la entrada +\begin_inset Formula $w_{1},\dots,w_{n}$ +\end_inset + + por +\begin_inset Formula $\$\mathtt{input}\mathcircumflex w_{1}\mathcircumflex w_{2}\cdots\mathcircumflex w_{n}\mathtt{NIL}\#$ +\end_inset + +. + Para evaluar un nombre +\begin_inset Formula $n$ +\end_inset + +, estando al final de la pila, se va hacia la izquierda hasta encontrar + +\begin_inset Formula $n$ +\end_inset + + y se va copiando al final, por ejemplo usando una cinta 2 auxiliar, hasta + encontrar +\begin_inset Formula $\#$ +\end_inset + +. + Para evaluar una asignación +\begin_inset Formula $n=e;f$ +\end_inset + +, primero se evalúa +\begin_inset Formula $e$ +\end_inset + +, lo que consiste en dejar el resultado al final de la pila (cinta 1), luego + se va a la izquierda hasta encontrar el último +\begin_inset Formula $\#$ +\end_inset + + (el más a la derecha) y se inserta +\begin_inset Formula $n$ +\end_inset + + justo detrás de +\begin_inset Formula $\#$ +\end_inset + + y +\begin_inset Formula $\#$ +\end_inset + + al final de la cinta; entonces se evalúa +\begin_inset Formula $f$ +\end_inset + +, se va a la izquierda hasta encontrar el último +\begin_inset Formula $\#$ +\end_inset + + y se copia de ahí hasta el final (usando la cinta 2) sobre los símbolos + desde el anterior +\begin_inset Formula $n$ +\end_inset + + en adelante, borrando el resto de después si queda algo. + Para evaluar una llamada a función +\begin_inset Formula $f(e_{1},\dots,e_{n})$ +\end_inset + +, se añade a la pila el símbolo +\begin_inset Formula $c_{i}$ +\end_inset + + que se refiere a la aparición concreta de llamada a función, se hace +\begin_inset Formula $s_{0}\mathtt{=}f\mathtt{.}s_{1}\mathtt{=}e_{1}\mathtt{.}\cdots s_{n}\mathtt{=}e_{n}\mathtt{.}$ +\end_inset + +, se va a la izquierda hasta encontrar +\begin_inset Formula $s_{0}$ +\end_inset + +, se va un paso a la derecha para leer el nombre de la primera variable, + se va a la derecha hasta encontrar +\begin_inset Formula $s_{1}$ +\end_inset + + que se cambia por dicho nombre, y se repite dicho proceso con el resto + de variables. + Entonces se evalúa el cuerpo de la función y se copia el resultado usando + la cinta 2 a la posición donde estaba +\begin_inset Formula $c_{i}$ +\end_inset + + en adelante, borrando los símbolos que sobran, y +\begin_inset Formula $c_{i}$ +\end_inset + + se usa para determinar la instrucción siguiente. + Para evaluar +\begin_inset Formula $(p_{1}\to e_{1};\dots;p_{n}\to e_{n})$ +\end_inset + +, se evalúa +\begin_inset Formula $p_{1}$ +\end_inset + +, se va a la izquierda hasta el último +\begin_inset Formula $\#$ +\end_inset + +, se va 1 a la derecha y, si se lee +\begin_inset Formula $\mathtt{NIL}$ +\end_inset + +, se hace lo mismo con +\begin_inset Formula $p_{2}$ +\end_inset + +, y así hasta +\begin_inset Formula $p_{n}$ +\end_inset + + que simplemente dejaría estar el +\begin_inset Formula $\mathtt{NIL}$ +\end_inset + + en este caso, y de lo contrario se borra la expresión y se evalúa el +\begin_inset Formula $e_{i}$ +\end_inset + + correspondiente. + Para +\begin_inset Formula $\mathtt{\{}e_{1}\mathtt{,}\dots\mathtt{,}e_{n}\mathtt{\}}$ +\end_inset + +, se usa una transición no determinista. +\end_layout + +\begin_deeper +\begin_layout Standard +Respecto a las funciones primitivas, estas bien podrían usar +\begin_inset Formula $s_{1}$ +\end_inset + + y +\begin_inset Formula $s_{2}$ +\end_inset + + como los nombres de parámetros. + Entonces +\family typewriter +cons +\family default + escribe +\begin_inset Formula $\mathcircumflex$ +\end_inset + +, copia lo de detrás de +\begin_inset Formula $s_{1}$ +\end_inset + + y copia lo de detrás de +\begin_inset Formula $s_{2}$ +\end_inset + +. + Por su parte, +\family typewriter +car +\family default + va a +\begin_inset Formula $c_{1}$ +\end_inset + + y empieza a copiar a la cinta 2, pero cada vez que encuentra +\begin_inset Formula $\mathcircumflex$ +\end_inset + + añade +\begin_inset Formula $($ +\end_inset + + al final de la cinta 3, cada vez que encuentra un átomo, si en la cinta + 3 el último símbolo era +\begin_inset Formula $($ +\end_inset + +, lo cambia por +\begin_inset Formula $\#$ +\end_inset + +, y si era +\begin_inset Formula $\#$ +\end_inset + +, lo cambia por B y va a la derecha, cambiando ese símbolo también por B + si era +\begin_inset Formula $\#$ +\end_inset + +, etc., y se para de copiar cuando la cinta solo contiene un +\begin_inset Formula $\#$ +\end_inset + +. + Entonces copia la cinta 2 al final de la 1. + Por su parte, +\family typewriter +cdr +\family default + hace esto mismo sin copiar, y cuando la cinta 3 solo contiene un +\begin_inset Formula $\#$ +\end_inset + +, empieza a encontrar hasta ver un +\begin_inset Formula $\#$ +\end_inset + + en la cinta 1. + Por su parte, +\family typewriter +atom +\family default + comprueba el símbolo detrás de +\begin_inset Formula $s_{1}$ +\end_inset + + y añade +\begin_inset Formula $\mathtt{T}$ +\end_inset + + o +\begin_inset Formula $\mathtt{NIL}$ +\end_inset + + al final de la cinta 1 según si lee un átomo o +\begin_inset Formula $\mathcircumflex$ +\end_inset + +, y +\family typewriter +eq +\family default + añade +\begin_inset Formula $\mathtt{T}$ +\end_inset + + o +\begin_inset Formula $\mathtt{NIL}$ +\end_inset + + en función de si los símbolos, ambos átomos, son iguales. + En cualquier caso se rechaza si el argumento no era del tipo esperado. + Las definiciones de +\family typewriter +accept +\family default + y +\family typewriter +reject +\family default + son triviales. +\end_layout + +\end_deeper +\begin_layout Itemize +\begin_inset Argument item:1 +status open + +\begin_layout Plain Layout +\begin_inset Formula $\succeq]$ +\end_inset + + +\end_layout + +\end_inset + +Para representar una máquina de Turing y una cadena arbitraria, como los + alfabetos pueden contener una cantidad arbitraria de símbolos y estados + y nuestro programa solo un número limitado de átomos, se denotan los símbolos + como átomos o pares. + La expresión de una +\begin_inset Formula $\text{MT}$ +\end_inset + + con transiciones +\begin_inset Formula $(q_{i},a_{i})\to(r_{i},b_{i},d_{i})$ +\end_inset + + será +\begin_inset Formula $(q_{i}a_{i}r_{i}b_{i}d_{i})_{i=1}^{n}\mathtt{|}w$ +\end_inset + +, donde cada símbolo o estado se representa como una serie de símbolos acabada + en +\family typewriter +. +\family default +, el símbolo inicial es +\family typewriter +Q0 +\family default +, el final es +\family typewriter +QF +\family default +, el símbolo blanco es +\family typewriter +BLANK +\family default + y los +\begin_inset Formula $d_{i}$ +\end_inset + + son +\family typewriter +L +\family default + o +\family typewriter +R +\family default +. +\end_layout + +\begin_deeper +\begin_layout Standard +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +not = fn(x) (x -> NIL, T -> T). +\end_layout + +\begin_layout Plain Layout + +equal = fn(a,b) (atom(a) -> (atom(b) -> eq(a,b), T -> NIL); +\end_layout + +\begin_layout Plain Layout + + T -> (atom(b) -> NIL; +\end_layout + +\begin_layout Plain Layout + + equal(car(a),car(b)) -> NIL; +\end_layout + +\begin_layout Plain Layout + + T -> equal(cdr(a),cdr(b)))). +\end_layout + +\begin_layout Plain Layout + +member = fn(x, list) +\end_layout + +\begin_layout Plain Layout + + (equal(list, NIL) -> NIL; +\end_layout + +\begin_layout Plain Layout + + equal(car(list), x) -> list; +\end_layout + +\begin_layout Plain Layout + + T -> member(x, cdr(list))). +\end_layout + +\begin_layout Plain Layout + +list2 = fn(a,b) cons(a, cons(b, NIL)). +\end_layout + +\begin_layout Plain Layout + +list3 = fn(a,b,c) cons(a, cons(b, cons(c, NIL))). +\end_layout + +\begin_layout Plain Layout + +assoc(list, key) = +\end_layout + +\begin_layout Plain Layout + + (equal(list, NIL) -> NIL; +\end_layout + +\begin_layout Plain Layout + + equal(car(car(list)), key) -> cdr(car(list)); +\end_layout + +\begin_layout Plain Layout + + T -> assoc(cdr(list), key)). +\end_layout + +\begin_layout Plain Layout + +divide-input = fn(s) +\end_layout + +\begin_layout Plain Layout + + (eq(car(s), |) -> cons(NIL, cdr(s)); +\end_layout + +\begin_layout Plain Layout + + T -> let rest = divide-input(cdr(s)). +\end_layout + +\begin_layout Plain Layout + + cons(cons(car(s), car(rest)), cdr(rest))). +\end_layout + +\begin_layout Plain Layout + +parse = fn(s) +\end_layout + +\begin_layout Plain Layout + + (atom(s) -> NIL; +\end_layout + +\begin_layout Plain Layout + + T -> next = parse-transition(s). +\end_layout + +\begin_layout Plain Layout + + cons(car(next), parse(cdr(next))). +\end_layout + +\begin_layout Plain Layout + +parse-transition = fn(s) +\end_layout + +\begin_layout Plain Layout + + state0 = parse-data(s). +\end_layout + +\begin_layout Plain Layout + + sym0 = parse-data(cdr(state0)). +\end_layout + +\begin_layout Plain Layout + + statef = parse-data(cdr(sym0)). +\end_layout + +\begin_layout Plain Layout + + symf = parse-data(cdr(statef)). +\end_layout + +\begin_layout Plain Layout + + dir = cdr(symf). +\end_layout + +\begin_layout Plain Layout + + (member(dir, [L R]) -> +\end_layout + +\begin_layout Plain Layout + + cons(cons(list2(car(state0), car(sym0)), +\end_layout + +\begin_layout Plain Layout + + list3(car(statef), car(symf), car(dir))), +\end_layout + +\begin_layout Plain Layout + + cdr(dir)); +\end_layout + +\begin_layout Plain Layout + + T -> reject()). +\end_layout + +\begin_layout Plain Layout + +parse-data(s) = fn(s) +\end_layout + +\begin_layout Plain Layout + + (eq(car(s), .) -> cons(NIL, cdr(s)); +\end_layout + +\begin_layout Plain Layout + + T -> next = parse-data(cdr(s)). +\end_layout + +\begin_layout Plain Layout + + cons(cons(car(s), car(next)), cdr(next))). +\end_layout + +\begin_layout Plain Layout + +car-member(list, x) = fn(s) +\end_layout + +\begin_layout Plain Layout + + (equal(list, NIL) -> NIL; +\end_layout + +\begin_layout Plain Layout + + equal(car(car(list)), x) -> T; +\end_layout + +\begin_layout Plain Layout + + T -> car-member(cdr(list), x)). +\end_layout + +\begin_layout Plain Layout + +has-dupes = fn(machine) +\end_layout + +\begin_layout Plain Layout + + (equal(machine, NIL) -> NIL; +\end_layout + +\begin_layout Plain Layout + + car-member(cdr(machine), car(car(machine))) -> T; +\end_layout + +\begin_layout Plain Layout + + T -> has-dupes(cdr(machine))). +\end_layout + +\begin_layout Plain Layout + +sim = fn(state, before, after) +\end_layout + +\begin_layout Plain Layout + + after = (equal(after, NIL) -> cons(BLANK, NIL), T -> after) +\end_layout + +\begin_layout Plain Layout + + (equal(state, [QF]) -> accept(); +\end_layout + +\begin_layout Plain Layout + + T -> trans = assoc(machine, list2(state, car(after))). +\end_layout + +\begin_layout Plain Layout + + next = car(trans). +\end_layout + +\begin_layout Plain Layout + + write = car(cdr(trans)). +\end_layout + +\begin_layout Plain Layout + + dir = car(cdr(cdr(trans))). +\end_layout + +\begin_layout Plain Layout + + (eq(dir, L) -> +\end_layout + +\begin_layout Plain Layout + + sim(next, +\end_layout + +\begin_layout Plain Layout + + cdr(before), +\end_layout + +\begin_layout Plain Layout + + cons(car(before), cons(write, cdr(after)))); +\end_layout + +\begin_layout Plain Layout + + eq(dir, R) -> +\end_layout + +\begin_layout Plain Layout + + sim(next, cons(write, before), cdr(after)))). +\end_layout + +\begin_layout Plain Layout + +decoded = divide-input(input). +\end_layout + +\begin_layout Plain Layout + +machine = parse(car(decoded)). +\end_layout + +\begin_layout Plain Layout + +(has-dupes(machine) -> reject(); +\end_layout + +\begin_layout Plain Layout + + T -> sim([Q0], NIL, cdr(decoded)) +\end_layout + +\end_inset + + +\end_layout + +\end_deeper +\end_body +\end_document |
