]> matita.cs.unibo.it Git - helm.git/commitdiff
Added universal turing machines (only comments for now).
authorWilmer Ricciotti <ricciott@cs.unibo.it>
Mon, 23 Apr 2012 11:33:11 +0000 (11:33 +0000)
committerWilmer Ricciotti <ricciott@cs.unibo.it>
Mon, 23 Apr 2012 11:33:11 +0000 (11:33 +0000)
matita/matita/lib/turing/universal.ma [new file with mode: 0644]

diff --git a/matita/matita/lib/turing/universal.ma b/matita/matita/lib/turing/universal.ma
new file mode 100644 (file)
index 0000000..357e354
--- /dev/null
@@ -0,0 +1,248 @@
+(* 
+Simboli:
+0 1 *0 *1 # | ,
+
+[lista di simboli] fa match su un simbolo qualunque nella lista
+ad esempio [#|,] fa match con la gratella "#", la barra verticale "|" e la virgola ","
+
+Convenzione variabili:
+- x,y,z,D     = bit (non marcati)
+- *x,*y,*z,*D = bit marcati
+- c,d,e = caratteri (bit marcati e non marcati e separatori)
+
+Convenzioni mosse:
+c/D --> Q : leggo c, scrivo c, mi sposto a D e passo allo stato Q
+c/d/D --> Q : leggo c, scrivo d, mi sposto a D e passo allo stato Q
+
+MACCHINA per confronto tuple:
+=============================
+Input:
+      *               *
+ ls # current # ... | input , output , D | ... # rs
+    ^
+    0
+
+Output:
+
+ ls # current # ... | input , output , D | ... # rs  (rimuove le marcature)
+    ^
+ SUCCESS
+
+      *                                    *
+ ls # current # ... | input , output , D | ... # rs (sposta la marcatura alla tupla successiva)
+    ^
+ FAILURE
+
+STATO 0:
+  #/R --> 1
+
+STATO 1:
+  \forall c != *z. c/L --> 1
+  \forall x. *x/x/R --> 2(x)
+
+STATO 2(x):
+  \forall y. y/*y/R --> 2
+  #/R --> 2
+
+STATO 3(x):
+  \forall y.\forall c != *y. c/R --> 3(x)
+  *x/x/R --> 4
+  *~x/~x/R --> 5
+
+STATO 4:
+  \forall x. x/*x/L --> 1
+  ,/R --> SUCCESS
+  
+STATO 5:
+  \forall c != |. c/R --> 5
+  |/R --> 6
+
+STATO 6:
+  \forall x. x/*x/L --> 7
+
+STATO 7:
+  \forall c != #. c/L --> 7
+  #/L
+
+STATO 8:
+  \forall c != #. c/L --> 8
+  \forall x. *x/x/L --> 8
+  #/R --> 9
+
+STATO 9:
+  \forall x. x/*x/L --> FAILURE
+
+
+==============================
+MACCHINA PER COPIA NUOVO STATO IN CURRENT
+==============================
+
+Input:
+  
+  ls # current # ... | in_state , out_state , D | ... # rs
+                                  ^
+                                  0
+
+Output:
+  ls # out_state # ... | in_state , out_state , D | ... # rs
+                                              ^
+                                              9
+
+STATO 0:
+  \forall x. x/*x/L --> 1
+
+STATO 1:
+  [01,|]/L --> 1
+  #/L --> 2
+
+STATO 2:
+  [01]/L --> 2
+  #/R -> 3
+
+STATO 3:
+  \forall x. x/*x/R --> 4
+  #/R --> 8
+
+STATO 4:
+  [01,|#]/R --> 4
+  \forall x. *x/x/R --> 5(x)
+
+STATO 5(x):
+  #/R --> 6(x)
+  \forall y. y/*y/L --> 7(x)
+
+STATO 6(x):
+  \forall D. D/*D/L --> 7(x)
+
+STATO 7(x):
+  [01,|#]/l --> 7(x)
+  \forall y. *y/x/R --> 3
+
+STATO 8:
+  [01,|#]/R --> 8
+  \forall D. *D/D/L --> 9
+
+STATO 9:
+  stato finale
+
+
+==================================
+MACCHINE PER SPOSTARE LA "TESTINA"
+================================
+
+Lo spostamento a sx si ottiene mediante
+
+ls x # current y # macchina # rs
+----C--->
+ls x # current # y macchina # rs
+----B--->
+ls x # current # macchina # y rs
+----B--->
+ls # x current # macchina # y rs
+----C--->
+ls # current x # macchina # y rs
+
+
+Lo spostamento a dx si ottiene mediante
+
+ls # current x # macchina # y rs
+----A--->
+ls x # current # macchina # y rs
+----A--->
+ls x # current # macchina y # rs
+----A--->
+ls x # current y # macchina # rs
+
+
+MACCHINA A
+----------
+Sposta il carattere binario su cui si trova la testina oltre il primo # alla sua sinistra.
+
+Input:
+  
+  ls # cs x rs
+          ^
+          0
+
+Output:
+  ls x # cs rs
+     ^
+     4
+
+STATO 0:
+  \forall x.x/L --> 1(x)
+
+STATO 1(x):
+  \forall c != #. c/x/R --> 2(c)
+  #/x/R --> 3
+
+STATO 2(c):
+  \forall d. d/c/L --> 0
+
+STATO 3:
+  \forall c. c/#/L --> 4
+
+STATO 4:
+  stato finale
+
+
+MACCHINA B
+----------
+Sposta il carattere binario su cui si trova la testina oltre il primo # alla sua destra.
+
+Input:
+
+  ls x cs # rs
+     ^
+     0
+
+Output:
+  ls cs # x rs
+          ^
+          4
+
+STATO 0:
+  \forall x.x/R --> 1(x)
+
+STATO 1(x):
+  \forall c != #. c/x/L --> 2(c)
+  #/x/L --> 3
+
+STATO 2(c):
+  \forall d. d/c/R --> 0
+
+STATO 3:
+  \forall c. c/#/L --> 4
+
+STATO 4:
+  stato finale
+
+
+MACCHINA C
+----------
+Sposta il carattere binario su cui si trova la testina appena prima del primo # alla sua destra.
+
+Input:
+  ls x cs # rs
+     ^
+     0
+
+Output:
+  ls cs x # rs
+        ^
+        3
+
+STATO 0:
+  \forall x. x/R --> 1(x)
+
+STATO 1(x):
+  \forall c != #. c/x/L --> 2(c)
+  #/#/L --> 3
+
+STATO 2(c):
+  \forall d. d/c/R --> 0
+
+STATO 3:
+  stato finale
+
+*)