Este artículo describe un algoritmo para el pensamiento y la conciencia. Ofrezco mi respuesta a la pregunta de cómo funcionan el pensamiento y la conciencia. Y demuestro un algoritmo que puede pensar de manera creativa y verdadera y poseer conciencia real. El artículo está destinado a programadores y consta de dos partes principales. La primera parte es puramente técnica, contiene una descripción del algoritmo, una lista de sus propiedades y un ejemplo de aplicación práctica. La segunda parte contiene tesis explicativas y una solución a la cuestión de la axiomatización constructiva de la conciencia. Un algoritmo es un texto significativo que habla por sí mismo y, por lo tanto, solo habrá comentarios mínimos prácticamente necesarios.
Descripción del algoritmo
La descripción del algoritmo se realiza en un formalismo matemático hecho a sí mismo de acuerdo con el principio "de arriba hacia abajo", es decir, primero se proporciona un registro abstracto y final, y luego se analiza el algoritmo por partes en el orden en que se realizan las llamadas y se hacen comentarios. Entonces, el algoritmo "ensamblado" es una función recursiva de la siguiente forma:
t n + 1 = composición [ abstracción [ deducción [t n ]]]; t 0 = s; t n , s ∈ S ; n ∈ NEl cálculo de esta función es pensar. Como puede ver, aparecen tres operadores en el registro:
composición [] ,
abstracción [] ,
deducción [] ; también hay: la variable semilla
s ∈ S , el conjunto de filas de una forma especial
S y el número de paso
n ∈ N. A continuación, consideramos en detalle cada pieza de repuesto. Comenzamos con el conjunto
S y sus elementos.
Para especificar el conjunto
S, es necesario determinar la sintaxis en la que se escribirán los elementos de este conjunto. Los elementos del conjunto
S se denominarán cadenas. Cualquier línea en
S consiste en una jerarquía de corchetes "(", ")", y los identificadores de caracteres arbitrarios se escriben dentro de los corchetes. Para evitar el uso del término "identificador", ya que puede ser necesario para otros fines, los identificadores simbólicos entre paréntesis se denominarán "mnemotécnicos". Cada mnemotecnia está escrita en caracteres latinos "A - z". Los mnemónicos entre paréntesis pueden estar separados por una coma ",". Si la longitud de la mnemotecnia es fija, que se especifica por separado, el separador no se establece. Los mnemónicos se escriben solo entre paréntesis. Una línea puede contener corchetes anidados. La jerarquía de corchetes en la cadena es arbitraria, pero debe haber un corchete de cierre para cada corchete de apertura. En este artículo, usaré solo letras pequeñas del alfabeto latino para escribir mnemónicos, y la longitud de los mnemónicos será fija, una letra corresponde a una mnemónica, no pongo un carácter separador. Ejemplos de líneas:
() ≡ ∅ es una cadena vacía.
(a) - una cadena que contiene una mnemotecnia "
a ".
(aa) : una cadena que contiene dos instancias de la mnemotecnia "
a ".
(ab) es una cadena que contiene dos mnemotécnicos "
a " y "
b ".
((a) (a)) : la línea contiene dos copias de la mnemotecnia "
a " y niveles anidados de corchetes.
Los corchetes adjuntos, junto con su contenido, así como los mnemotécnicos individuales, a veces se denominarán "componentes de cadena", en los casos en que se requiera una generalización adecuada. Por ejemplo, la línea
((a) ab) contiene cuatro componentes, entre ellos: dos componentes "
a ", un componente "
(a) " y un componente "
b ".
Los registros de cadenas que coinciden con una permutación de los componentes dentro de la cadena se consideran idénticos. Ejemplos de líneas idénticas:
(ab) ≡ (ba) .
((a) (b)) ≡ ((b) (a)) .
(abc) ≡ (bac) ≡ (cba) ≡ (acb) ≡ (bca) ≡ (cabina) .
((a) (ab)) ≡ ((a) (ba)) ≡ ((ab) (a)) ≡ ((ba) (a)) .
Las líneas pueden contener cualquier número de componentes idénticos y repetidos, y en este caso, es posible un registro más corto utilizando el índice de repetición, que se coloca antes del componente a la izquierda, sin un separador. Ejemplos:
(aa) ≡ (2a) .
(aabb) ≡ (2a2b) .
((a) (a)) ≡ (2 (a)) .
((aa) (aa)) ≡ (2 (2a)) .
(aa (bb) (bb) (ccc) (ccc) (ccc)) ≡ (2a2 (2b) 3 (3c)) .
En aquellos casos donde la cadena contiene componentes vacíos, por ejemplo,
(a ()) ,
(a () () (b)), las identidades contienen:
(a ()) ≡ (a) ,
(a () () (b )) ≡ (a (b)) , es decir, los componentes vacíos se desechan.
Definición El conjunto
S consta de todas las cadenas posibles que satisfacen los criterios de sintaxis anteriores, incluida una cadena vacía.
Los operadores de deducción, abstracción y composición se definen en el conjunto
S. Los argumentos del operador se indican entre corchetes
[] , porque los paréntesis están reservados para la sintaxis de cadenas. El término "operador" es sinónimo del término "función".
Operador de deducción . Definición
∀s ∈ S , deducción k [s] ∈ S , k ∈ N , k> 1, deducción [s] ≝ deducción 2 [s] . Toma la cadena
s de
S como argumento. Como resultado, devuelve una cadena de
S. Acción. El operador
k multiplica por dos cada componente de la cadena y toda la cadena. La estructura resultante está enmarcada por corchetes externos comunes. La duplicación comienza con los componentes más profundos, en términos de anidamiento. La fila completa se duplica al final. Para propósitos prácticos inmediatos, es suficiente que
k = 2 , así que
definí un caso especial de
deducción [s] ≝ deducción 2 [s] . El uso de la
deducción [] implica que
k = 2 , es decir, como resultado del operador de
deducción [s] , todos los componentes de la cadena
s se duplican. Ejemplos:
deducción [(a)] = ((aa) (aa)).
deducción [(aa)] = ((aaaa) (aaaa))
deducción [(ab)] = ((aabb) (aabb)).
deducción [(a (b))] = ((aa (bb) (bb)) (aa (bb) (bb))).
deducción [((a) (b))] = (((aa) (aa) (bb) (bb)) ((aa) (aa) (bb) (bb))).
deducción [((a) (b (cc)))] = (((aa) (aa) (bb (cccc) (cccc)) (bb (cccc) (cccc))) ((aa) (aa) ( bb (cccc) (cccc)) (bb (cccc) (cccc)))) .
Operador de abstracción . Definición
∀s ∈ S , abstracción [s] ⊂ S. Toma la cadena
s de
S como argumento. Como resultado, devuelve muchas filas. Principio de acción. Un operador de abstracción crea muchas líneas a partir de una línea fuente utilizando una operación especial: paréntesis de componentes idénticos. La operación de horquillado se aplica solo a los corchetes anidados que están en el mismo nivel de anidamiento. El principio general del horquillado. Si en cualquier combinación de corchetes ubicados en el mismo nivel, los mismos componentes están dentro de los corchetes, entonces cualquier conjunto de los mismos componentes se puede poner entre corchetes, y los componentes que permanecieron intactos deben combinarse bajo los mismos corchetes generales del mismo nivel. Considera un ejemplo. Cadena
((ab) (ac)) . En esta línea, hay dos subcadenas en el mismo nivel:
(ab) y
(ac) , dentro de las cuales hay la misma mnemotecnia "
a ", esta mnemónica se puede poner entre paréntesis y el resultado es
(a (bc)) . Como puede ver, los mnemónicos restantes "
b " y "
c " se combinan entre paréntesis comunes. Considere un ejemplo menos obvio. La cadena
((aa) (aa)) contiene las subcadenas
(aa) y
(aa) , en este caso hay dos opciones diferentes para poner entre paréntesis. En la primera variante, solo se puede sacar una mnemotecnia "
a " de los corchetes de cada subcadena, y en la segunda variante, se puede sacar un grupo de mnemotecnias "
aa ". Consideremos ambas opciones con más detalle.
Primera opción, demostración paso a paso:
- Paso uno, elige ( rojo ) qué sacar (( a a) ( a a)) .
- Paso dos, haga el seleccionado ( a (... a) (... a)) .
- Paso tres, combine los restos entre paréntesis comunes ( a (... a ... a)) .
- Resultado (a (aa)) .
La segunda opción, en pasos:
- Paso uno, elige qué sacar (( aa ) ( aa )) .
- Paso dos, haga el seleccionado ( aa (...) (...)) .
- Paso tres, combine los restos entre paréntesis comunes ( aa (...)) .
- Cuarto paso, deseche los componentes vacíos ( aa ) .
- Resultado (aa) .
Vamos a complicar el ejemplo. Deje que se le dé la cadena
((aa) (aab) (aab)) , tiene tres subcadenas ubicadas en el mismo nivel:
(aa) ,
(aab) ,
(aab) , las tres tienen el mismo contenido. La regla de paréntesis no nos obliga a realizar la operación para las tres subcadenas a la vez. Para la operación de replanteo, puede seleccionar cualquier grupo de subcadenas.
En este caso, hay tres opciones no idénticas para agrupar subcadenas:
- (aa), (aab) .
- (aab), (aab) .
- (aa), (aab), (aab) .
Realizamos todas las declaraciones posibles para cada una de las opciones de agrupación, paso a paso.
Agrupación
(aa) ,
(aab) . Cadena
((aa) (aab) (aab)) .
La primera opcion:
- Seleccione el contenido (( a a) ( a ab) (aab)) .
- Sacamos ( a (... a) (... ab) (aab)) .
- Combinar ( a (... a ... ab) (aab)) .
- Resultado No. 1 (a (aab) (aab)) .
La segunda opción:
- Seleccione el contenido (( aa ) ( aa b) (aab)) .
- Sacamos ( aa (...) (... b) (aab)) .
- Combinar ( aa (... b) (aab)) .
- Resultado No. 2 (a (b) (aab)) .
Agrupación
(aab) ,
(aab) . Cadena
((aa) (aab) (aab)) .
La primera opcion:
- Seleccione el contenido ((aa) ( a ab) ( a ab)) .
- Sacamos ((aa) a (... ab) (... ab)) .
- Combina ((aa) a (... ab ... ab)) .
- Resultado No. 3 (a (aa) (aabb)) .
La segunda opción:
- Seleccione el contenido ((aa) ( aa b) ( aa b)) .
- Sacamos ((aa) aa (... b) (... b)) .
- Combina ((aa) aa (... b ... b)) .
- Resultado No. 4 (aa (aa) (bb)) .
La tercera opción:
- Seleccione el contenido ((aa) (a ab ) (a ab )) .
- Sacamos ((aa) ab (... a) (... a)) .
- Combina ((aa) ab (... a ... a)) .
- Resultado No. 5 (ab (aa) (aa)) .
Cuarta opción:
- Seleccione el contenido ((aa) (aa b ) (aa b )) .
- Sacamos ((aa) b (... aa) (... aa)) .
- Combina ((aa) b (... aa ... aa)) .
- Resultado No. 6 (b (aa) (aaaa)) .
Quinta opción:
- Seleccione el contenido ((aa) ( aab ) ( aab )) .
- Sacamos ((aa) aab (...) (...)) .
- Combina ((aa) aab (...)) .
- Resultado No. 7 (aab (aa)) .
Agrupación
(aa) ,
(aab) ,
(aab) . Cadena
((aa) (aab) (aab)) .
La primera opcion:
- Seleccione el contenido (( a a) ( a ab) ( a ab)) .
- Sacamos ( a (... a) (... ab) (... ab)) .
- Combinar ( a (... a ... ab ... ab)) .
- Resultado No. 8 (a (aaabb)) .
La segunda opción:
- Seleccione el contenido (( aa ) ( aa b) ( aa b)) .
- Sacamos ( aa (...) (... b) (... b)) .
- Combinar ( aa (... b ... b)) .
- Resultado No. 9 (aa (bb)) .
La acción del operador de abstracción . Como puede ver en el ejemplo, para la fila original
((aa) (aab) (aab)), hay nueve opciones diferentes para poner algo fuera de los corchetes, y nueve líneas resultantes corresponden a estas opciones. Así es como actúa el operador de abstracción: itera sobre todas las opciones posibles para poner entre corchetes y crea el conjunto correspondiente de filas resultantes. Además, el operador de abstracción está buscando opciones para distinguir no solo en la línea de origen, sino también en todas las líneas de resultado resultantes. En otras palabras, el operador de abstracción se aplica de forma recursiva a sus resultados, y así sucesivamente hasta que se agoten todas las opciones posibles. Por razones obvias, para cualquier línea final, el número de posibles opciones de eliminación también es limitado.
Volvamos al ejemplo anterior. En el ejemplo considerado, no escribí todas las opciones posibles, sino solo nueve piezas del primer nivel. Para ilustrar el efecto completo del operador de abstracción, es necesario construir todas las opciones para poner entre paréntesis para cada uno de los nueve resultados obtenidos previamente. Vamos a escribir todas las opciones, pero de una manera más concisa.
Resultado No. 1
(a (aab) (aab)) :
1.1.
(a ( a ab) ( a ab)) => (a a (aabb)) .
1.2.
(a ( aa b) ( aa b)) => (a aa (bb)) .
1.3.
(a (a ab ) (a ab )) => (a ab (aa)) . * No. 7
1.4.
(a ( aab ) ( aab )) => ( aab ) .
1.5.
(a (aa b ) (aa b )) => (a b (aaaa)) .
Resultado No. 2
(a (b) (aab)) :
2.1.
(a ( b ) (aa b )) => (a b (aa)) .
Resultado No. 3
(a (aa) (aabb)) :
3.1.
(a ( a a) ( a abb)) => (a a (aabb)) . * No. 1.1
3.2.
(a ( aa ) ( aa bb)) => (a aa (bb)) . * No. 1.2
Resultado No. 4
(aa (aa) (bb)) .
Resultado No. 5
(ab (aa) (aa)) :
5.1.
(ab ( a a) ( a a)) => ( a ab (aa)) . * No. 7, * No. 1.3
5.2.
(ab ( aa ) ( aa )) => ( aa ab) . * No. 1.4
Resultado no 6
(b (aa) (aaaa)) :
6.1.
(b ( a a) ( a aaa)) => ( a b (aaaa)) . * No. 1.5
6.2.
(b ( aa ) ( aa aa)) => ( aa b (aa)) . * No. 7, * No. 1.3, * No. 5.1
Resultado No. 7
(aab (aa)) .
Resultado No. 8
(a (aaabb)) .
Resultado No. 9
(aa (bb)) .
Un asterisco indica opciones que se repiten. Solo se incluyen variaciones únicas en el resultado de la abstracción. En el ejemplo analizado, hay catorce líneas de resultados únicas. Total:
abstracción [((aa) (aab) (aab))] =
{
(a (aab) (aab)), (aa (aabb)), (aaa (bb)), (aaab), (a (b) (aab)), (ab (aa)), (a (aa) (aabb)), (aa (aa) (bb)), (ab (aa) (aa)), (b (aa) (aaaa)), (ab (aaaa)), (aab (aa)), ( a (aaabb)), (aa (bb))
}Para mayor claridad, considere un par de ejemplos más.
Cadena
((a (b)) (a (b))) . Opciones de paréntesis. Primera iteración:
(( a (b)) ( a (b))) => ( a ((b) (b))) , resultado No. 1.
((a (b) ) (a (b) )) => ( (b) (aa)) , resultado No. 2.
(( a (b) ) ( a (b) )) => ( a (b) ) , resultado No. 3.
En el primer resultado, se puede tomar una decisión más. Segunda iteración:
(a (( b ) ( b ))) => (a ( b )) , el resultado No. 1.2 coincide con el resultado No. 3.
Total:
abstracción [((a (b)) (a (b)))] = {(a ((b) (b))), ((b) (aa)), (a (b))}Gran ejemplo:abstracción [ deducción [(a (b))]] = abstracción [((aa (bb) (bb)) (aa (bb) (bb)))] =>
1. ((aa ( b b) ( b b)) (aa (bb) (bb))) => ((aa b (b)) (aa (bb) (bb))) .
1.1. (( a ab (b)) ( a a (bb) (bb))) => ( a (aab (b) (bb) (bb))) .
1.1.1. (a (aab ( b ) ( b b) (bb))) => (a (aab b (b) (bb))) .
1.1.1.1. (a (aabb ( b ) ( b b))) => (a (aabb b (b))) .
1.1.2. (a (aab ( b ) ( b b) ( b b))) => (a (aab b (bb))) .
1.1.3. (a (aab (b) ( b b) ( b b))) => (a (aab b (b) (bb))) .
1.1.3.1. (a (aabb ( b ) ( b b))) => (a (aabb b (b))) .
1.1.4. (a (aab (b) ( bb ) ( bb ))) => (a (aab bb (b))) .
1.2. (( aa b (b)) ( aa (bb) (bb))) => ( aa (b (b) (bb) (bb))) .
1.2.1 (aa (b ( b ) ( b b) (bb))) => (aa (b b (b) (bb))) .
1.2.1.1. (aa (bb ( b ) ( b b))) => (aa (bb b (b))) .
1.2.2. (aa (b ( b ) ( b b) ( b b))) => (aa (b b (bb))) .
1.2.3 (aa (b (b) ( b b) ( b b))) => (aa (b b (b) (bb))) .
1.2.3.1. (aa (bb ( b ) ( b b))) => (aa (bb b (b))) .
1.2.4. (aa (b (b) ( bb ) ( bb ))) => (aa (b bb (b))) .
1.3. ((aab (b)) (aa ( b b) ( b b))) => ((aab (b)) (aa b (bb))) .
1.3.1. (( a ab (b)) ( a ab (bb))) => ( a (aabb (b) (bb))) .
1.3.1.1. (a (aabb ( b ) ( b b))) => (a (aabb b (b))) .
1.3.2. (( aa b (b)) ( aa b (bb))) => ( aa (bb (b) (bb))) .
1.3.2.1. (aa (bb ( b ) ( b b))) => (aa (bb b (b))) .
1.3.3. (( aab (b)) ( aab (bb))) => ( aab ((b) (bb))) .
1.3.3.1. (aab (( b ) ( b b))) => (aab ( b (b))) .
1.3.4. ((a ab (b)) (a ab (bb))) => ( ab (aa (b) (bb))) .
1.3.4.1. (ab (aa ( b ) ( b b))) => (ab (aa b (b))) .
1.3.5. ((aa b (b)) (aa b (bb))) => ( b (aaaa (b) (bb))) .
1.3.5.1. (b (aaaa ( b ) ( b b))) => (b (aaaa b (b))) .
1.4. ((aab (b)) (aa ( bb ) ( bb ))) => ((aab (b)) (aa bb )) .
1.4.1. (( a ab (b)) ( a abb)) => ( a (aabbb (b))) .
1.4.2. (( aa b (b)) ( aa bb)) => ( aa (bbb (b))) .
1.4.3. (( aab (b)) ( aab b)) => ( aab (b (b))) .
1.4.4. ((a ab (b)) (a ab b)) => ( ab (aab (b))) .
1.4.5. ((aa b (b)) (aa b b)) => ( b (aaaab (b))) .
2. ((aa ( bb ) ( bb )) (aa (bb) (bb))) => ((aa bb ) (aa (bb) (bb))) .
2.1. ((aabb) (aa ( b b) ( b b))) => ((aabb) (aa b (bb))) .
2.1.1 (( a abb) ( a ab (bb))) => ( a (aabbb (bb))) .
2.1.2. (( aa bb) ( aa b (bb))) => ( aa (bbb (bb))) .
2.1.3. (( aab b) ( aab (bb))) => ( aab (b (bb))) .
2.1.4. ((a ab b) (a ab (bb))) => ( ab (aab (bb))) .
2.1.5. ((aa b b) (aa b (bb))) => ( b (aaaab (bb))) .
2.2. ((aabb) (aa ( bb ) ( bb ))) => ((aabb) (aa bb )) .
2.2.1. (( a abb) ( a abb)) => ( a (aabbbb)) .
2.2.2. (( aa bb) ( aa bb)) => ( aa (bbbb)) .
2.2.3. (( aab b) ( aab b)) => ( aab (bb)) .
2.2.4. ((a abb ) (a abb )) => ( abb (aa)) .
2.2.5. (( aabb ) ( aabb )) => ( aabb ) .
2.2.6. ((a ab b) (a ab b)) => ( ab (aabb)) .
2.2.7. ((aa b b) (aa b b)) => ( b (aaaabb)) .
2.2.8. ((aa bb ) (aa bb )) => ( bb (aaaa)) .
2.3. (( a abb) ( a a (bb) (bb))) => ( a (aabb (bb) (bb))) .
2.3.1. (a (aabb ( b b) ( b b))) => (a (aabb b (bb))) .
2.3.2. (a (aabb ( bb ) ( bb ))) => (a (aabb bb )) .
2.4. (( aa bb) ( aa (bb) (bb))) => ( aa (bb (bb) (bb))) .
2.4.1 (aa (bb ( b b) ( b b))) => (aa (bb b (bb))) .
2.4.2 (aa (bb ( bb ) ( bb ))) => (aa (bb bb )) .
3. (( a a (bb) (bb)) ( a a (bb) (bb))) => ( a (aa (bb) (bb) (bb) (bb))) .
3.1. (a (aa ( b b) ( b b) (bb) (bb))) => (a (aa b (bb) (bb) (bb))) .
3.1.1. (a (aab ( b b) ( b b) (bb))) => (a (aab b (bb) (bb))) .
3.1.1.1. (a (aabb ( b b) ( b b))) => (a (aabb b (bb))) .
3.1.1.2. (a (aabb ( bb ) ( bb ))) => (a (aabb bb )) .
3.1.2. (a (aab ( b b) ( b b) ( b b))) => (a (aab b (bbb))) .
3.1.3. (a (aab ( bb ) ( bb ) (bb))) => (a (aab bb (bb))) .
3.1.4. (a (aab ( bb ) ( bb ) ( bb ))) => (a (aab bb )) .
3.2. (a (aa ( bb ) ( bb ) (bb) (bb))) => (a (aa bb (bb) (bb))) .
3.2.1. (a (aabb ( b b) ( b b))) => (a (aabb b (bb))) .
3.2.2. (a (aabb ( bb ) ( bb ))) => (a (aabb bb )) .
3.3. (a (aa ( b b) ( b b) ( b b) (bb))) => (a (aa b (bbb) (bb))) .
3.3.1 (a (aab ( b bb) ( b b))) => (a (aab b (bbb))) .
3.3.2. (a (aab ( bb b) ( bb ))) => (a (aab bb (b))) .
3.4. (a (aa ( b b) ( b b) ( b b) ( b b))) >> (a (aa b (bbbb))) .
3.5. (a (aa ( bb ) ( bb ) ( bb ) (bb))) => (a (aa bb (bb))) .
3.6. (a (aa ( bb ) ( bb ) ( bb ) ( bb ))) => (a (aa bb )) .
4. (( aa (bb) (bb)) ( aa (bb) (bb))) >> ( aa ((bb) (bb) (bb) (bb))) .
4.1. (aa (( b b) ( b b) (bb) (bb))) => (aa ( b (bb) (bb) (bb))) .
4.1.1 (aa (b ( b b) ( b b) (bb))) => (aa (b b (bb) (bb))) .
4.1.1.1. (aa (bb ( b b) ( b b))) => (aa (bb b (bb))) .
4.1.1.2. (aa (bb ( bb ) ( bb ))) => (aa (bb bb )) .
4.1.2. (aa (b ( b b) ( b b) ( b b))) => (aa (b b (bbb))) .
4.1.3. (aa (b ( bb ) ( bb ) (bb))) => (aa (b bb (bb))) .
4.1.4. (aa (b ( bb ) ( bb ) ( bb ))) => (aa (b bb )) .
4.2. (aa (( bb ) ( bb ) (bb) (bb))) => (aa ( bb (bb) (bb))) .
4.2.1 (aa (bb ( b b) ( b b))) => (aa (bb b (bb))) .
4.2.2 (aa (bb ( bb ) ( bb ))) => (aa (bb bb )) .
4.3. (aa (( b b) ( b b) ( b b) (bb))) => (aa ( b (bbb) (bb))) .
4.3.1. (aa (b ( b bb) ( b b))) => (aa (b b (bbb))) .
4.3.2. (aa (b ( bb b) ( bb ))) => (aa (b bb (b))) .
4.4. (aa (( b b) ( b b) ( b b) ( b b))) >> (aa ( b (bbbb))) .
4.5. (aa (( bb ) ( bb ) ( bb ) (bb))) => (aa ( bb (bb))) .
4.6. (aa (( bb ) ( bb ) ( bb ) ( bb ))) => (aa ( bb )) .
5. ((aa (bb) (bb)) (aa (bb) (bb))) => ( (bb) (aaaa (bb) (bb))) .
5.1. ((bb) (aaaa ( b b) ( b b))) => ((bb) (aaaa b (bb))) .
5.1.1 (( b b) (aaaa b (bb))) => ( b (aaaab (bb))) .
5.2. ((bb) (aaaa ( bb ) ( bb ))) => ((bb) (aaaa bb )) .
5.2.1. (( b b) (aaaa b b)) => ( b (aaaabb)) .
5.2.2. (( bb ) (aaaa bb )) => ( bb (aaaa)) .
6. ((aa (bb) (bb) ) (aa (bb) (bb) )) => ( (bb) (bb) (aaaa)) .
6.1. (( b b) ( b b) (aaaa)) => ( b (bb) (aaaa)) .
6.2. (( bb ) ( bb ) (aaaa)) => ( bb (aaaa)) .
7. ((a a (bb) (bb)) (a a (bb) (bb))) => ( a (bb) (aa (bb) (bb))) .
7.1. (a (bb) (aa ( b b) ( b b))) => (a (bb) (aa b (bb))) .
7.1.1 (a ( b b) (aa b (bb))) => (a b (aab (bb))) .
7.2. (a (bb) (aa ( bb ) ( bb ))) => (a (bb) (aa bb )) .
7.2.1 (a ( b b) (aa b b)) => (a b (aabb)) .
7.2.2 (a ( bb ) (aa bb )) => (a bb (aa)) .
8. (( aa (bb) (bb)) ( aa (bb) (bb))) => ( aa (bb) ((bb) (bb))) .
8.1. (aa (bb) (( b b) ( b b))) => (aa (bb) ( b (bb))) .
8.1.1 (aa ( b b) ( b (bb))) => (aa b (b (bb))) .
8.2. (aa (bb) (( bb ) ( bb ))) => (aa (bb) ( bb )) .
8.2.1. (aa ( b b) ( b b)) => (aa b (bb)) .
8.2.2. (aa ( bb ) ( bb )) => (aa bb ) .
9. ((a a (bb) (bb) ) (a a (bb) (bb) )) => ( a (bb) (bb) (aa)) .
9.1. (a (aa) ( b b) ( b b)) => (a b (aa) (bb)) .
9.2. (a (aa) ( bb ) ( bb )) => (a bb (aa)) .
10. (( aa (bb) (bb) ) ( aa (bb) (bb) )) => ( a (bb) (bb) ) .
10.1 (a ( b b) ( b b)) => (a b (bb)) .
10.2 (a ( bb ) ( bb )) => (a bb ) .
De la lista anterior de filas resultantes (a la derecha de la flecha), debe seleccionar todas las únicas, y este conjunto de filas únicas será el resultado de la abstracción [((aa (bb) (bb)) (aa (bb) (bb))]] . No escribiré líneas únicas, ya que esto no agregará nada a la explicación. A continuación, al considerar la optimización y el uso práctico del algoritmo, me referiré a este ejemplo.
Operador de composición . Definición
∀U ⊂ S , U ≠ ∅, composición [U] ≠ ∅, composición [U] ∈ S. Acepta muchas líneas de entrada y devuelve una línea. Acción. El operador prepara el contenido para la próxima iteración del algoritmo. Después de la acción del operador de abstracción, aparecen muchas líneas, y en la etapa de composición, se produce la selección y concatenación de líneas para la próxima iteración del algoritmo. Con más detalle consideraré este tema en las secciones de optimización y uso práctico. En el caso más simple, el operador de composición realiza una concatenación simple de todos los resultados de abstracción. Entonces lo definimos. Ejemplo:
composición [ abstracción [((a (b)) (a (b)))]] = composición [{(a ((b) (b))), ((b) (aa)), (a ( b))}] = ((a ((b) (b))) ((b) (aa)) (a (b))) .
Propiedades del algoritmo
El algoritmo produce cadenas. El conjunto de todas las líneas que se forman como resultado de la operación iterativa del algoritmo se denominará "salida del algoritmo" o simplemente "salida". Definición de inferencia.
T s ≝ {t n | t n + 1 = composición [ abstracción [ deducción [t n ]]]; t 0 = s; t n , s ∈ S ; n ∈ N }. T s es la salida para la semilla
s . En aquellos casos en los que
T no tiene un parámetro, estamos hablando de la conclusión de cualquier semilla. Propiedad de inferencia:
∀s, e ∈ S , s ≠ ∅, e ≠ ∅, s ≠ e, T s ∩ T e = ∅ . Esto significa que cada elemento de salida corresponde únicamente a la semilla. Como resultado, la conclusión es única para cada semilla.
Una interpretación significativa de la deducción y la abstracción . El significado físico del operador de deducción es el siguiente. A partir de la línea original, de manera universal, el operador de deducción crea un objeto constructivo fundamentalmente nuevo con propiedades internas fundamentalmente nuevas y más complejas. En una aproximación intuitiva, podemos decir que la deducción agrega información cualitativamente nueva. A su vez, el operador de abstracción analiza el nuevo objeto en partes y, por lo tanto, expresa la información agregada en la etapa de deducción en un equivalente constructivo. Puede notar que como resultado del procedimiento de eliminación de paréntesis hay una pérdida de información. Además, para esta sintaxis, poner entre paréntesis es una forma universal de perder información de manera significativa en ausencia de datos a priori sobre el valor de las cadenas. Es decir, desde el punto de vista del algoritmo, todas las opciones posibles para la pérdida de información que se calculan en la etapa de abstracción, de hecho, son el valor de las líneas. Por lo tanto, en cada paso, el algoritmo crea una nueva heurística sintáctica única. Y cada heurística posterior es fundamentalmente más compleja y más sustancial que la anterior. En cada iteración del algoritmo, aparece un nuevo conocimiento.
Aplicación práctica
El algoritmo es una "cosa en sí misma".
Él piensa, pero este es el pensamiento de un "extraterrestre". Para obtener beneficios prácticos del pensamiento extraterrestre, debes encontrar un lenguaje común con él. Por un lado, se requiere entrenar a un extraterrestre y, por otro lado, aprender a entenderlo, al final, para establecer una comunicación significativa. En general, el paradigma de interacción con el algoritmo es similar a los conocidos principios de interacción con la "caja negra". Además, para mayor comodidad, llamaré al algoritmo de pensamiento el alien Kohl.Considere el caso ideal. Supongamos que tenemos un poder de cómputo ilimitado a nuestra disposición y podemos permitirnos calcular cualquier número de iteraciones del pensamiento de Kolya sin preocuparnos por los problemas de optimización. En este caso, se requerirán los siguientes ingredientes para interactuar con Kolya:- Un modelo digital de un entorno interactivo cuyo significado de actividad es conocido.
- Un modelo digital de una herramienta que puede afectar el medio ambiente.
- Codificación de algoritmo para señales codifican desde el entorno de cadenas S .
- Un algoritmo de decodificación que será de alguna manera difuso, pero racionalmente justificado para decodificar líneas previamente desconocidas de S y convertirlas en señales para el instrumento.
Con tales componentes, es posible organizar un esquema de aprendizaje universal con una motivación desconocida, que permitirá adaptar el pensamiento de Kolya al entorno. A continuación se muestra el pseudocódigo.S NextThought(S prevThought, S ExternalSignal, int exposure = 1) { S t = composition[prevThought, ExternalSignal]; for (int i = 0; i < exposure; i++) t = composition[abstraction[deduction[t]]]; return t; } EnvironmentModel e; S s = encode(e.GetState()); S o = ∅; while (0) { S o = NextThought(o, s); e.ImpactTool.perform(decode(o)); s = encode(e.GetState()); }
Circuito de retroalimentación . Al principio, Kolya no tiene pensamientos. El primer pensamiento de Kolya es el estado inicial codificado del medio. En cada iteración, una señal externa se vierte en el pensamiento de Kolya. Después de lo cual Kolya piensa durante el tiempo de exposición. Los resultados del pensamiento son decodificados y enviados a la herramienta. A su vez, la acción de la herramienta de alguna manera cambia el estado del entorno. Y todo se repite de nuevo. Con el tiempo, el pensamiento de Kolya se adaptará al entorno y comenzará a mostrar signos de comportamiento altamente organizado y motivado subjetivamente. Sin embargo, la motivación de Kolya seguirá siendo desconocida. Para comprender su motivación, en la siguiente etapa del entrenamiento, es necesario realizar experimentos, es decir, cambiar a propósito el entorno y estudiar las reacciones de Kolya a los cambios. Si es posible describir el comportamiento externo deseado de Kolya en términos de alguna función objetivo, entonces el proceso de aprendizaje puede automatizarse, por ejemplo, utilizando un algoritmo genético.
Problema de decodificación . Es necesario decodificar los pensamientos de Kolya para sintetizar una señal para el instrumento. La dificultad es que cada pensamiento, como señalé en la sección anterior, es un diseño fundamentalmente nuevo. Es decir, un investigador hipotético nunca puede comprender completamente el contenido de los pensamientos de Kolya. Parte del contenido producido por el pensamiento de Kolya, no importa cuánto se estudie, siempre será algo completamente oscuro. Solo algunos de los fragmentos de pensamiento más altamente organizados pueden ser reconocidos de manera significativa, y esta es una restricción fundamental e insuperable en la comunicación con Kolya. Pero en términos prácticos, esta restricción no es fundamental. Dado que, en primer lugar, se puede especificar infinitamente el lado significativo de los pensamientos de Kolya, y en segundo lugar, no hay necesidad de comprender completamente a Kolya. Es suficiente desarrollar un lenguaje común dentro del cual pueda explicar sobre cuestiones prácticas. Desde un punto de vista técnico, la situación es la siguiente. La señal entrante que describe el estado del medio está codificada en algún idioma. Las palabras y las declaraciones del lenguaje son cadenas de
S. El lenguaje tiene su propio vocabulario, sintaxis y semántica. El contenido de cada iteración de pensamiento de acuerdo con criterios gramaticales se dividirá en varias categorías:
1. Fragmentos con vocabulario desconocido.
2. Sintaxis desconocida.
3. Semántica desconocida.
4. Fragmentos gramatical y semánticamente correctos.
El contenido de todas estas categorías es arbitrario según el método de ocurrencia. Es decir, incluso en el caso de fragmentos gramaticalmente correctos, esto es un accidente y no se sabe qué significado les da Kolya, ya que su significado interno es accesible solo para él. A priori, no hay criterios para conectar correctamente los pensamientos de Kolya y las acciones correspondientes del instrumento. Y en este asunto queda depender únicamente del propio Kolya. Su comportamiento es arbitrario y solo él puede comprender su motivación a medida que aumenta el grado de organización de su pensamiento. En este caso, cualquier esquema racional para responder a los pensamientos de Kolya será aceptable y productivo, la única pregunta es la efectividad relativa de los diversos esquemas. La opción básica es responder a todos los fragmentos gramaticalmente correctos, incluso si su contenido es absurdo. En general, todo lo que se puede convertir en términos de la codificación original debe transformarse y reaccionar. Y así sucesivamente hasta que Kohl "se dio cuenta" de reacciones significativas. Y, por supuesto, será útil el modelo más plástico del entorno con un gran número de grados de libertad. El medio, de alguna manera, se convertirá en el cuerpo de Kolya.
El problema de la potencia informática limitada . En términos de la cantidad de cálculo, el algoritmo es pesado. Claramente, varias docenas de iteraciones agotarán toda la potencia informática del planeta. Podemos confiar en dispositivos cuánticos y en el hecho de que existe un análogo cuántico del algoritmo, pero hasta ahora solo ha habido una salida: en lugar de un pensamiento enormemente complejo, piense muchos pensamientos pequeños y simples en paralelo. Hay varios trucos técnicos para esto:
1. En la etapa de composición, no es necesario incluir en el resultado todas las muchas abstracciones. Para que el algoritmo conserve sus propiedades fundamentales, es suficiente seleccionar del conjunto solo dos filas resultantes independientes. El criterio de independencia es la diferencia distinta de cero de los primeros dígitos en la numeración jerárquica de los resultados de la abstracción. Pasamos al gran ejemplo, que es más alto bajo el spoiler. Todas las líneas están numeradas según el principio de
abcd. Un par de líneas con índices
a1.b1.c1.d1 ... ,
a2.b2.c2.d2 ... se llama independiente si
a1 ≠ a2 . Y esto significa que es posible dividir todo el resultado de la abstracción en pares independientes y para cada par en el siguiente paso, comenzar su propia rama computacional. Además, no es necesario utilizar todos los resultados de la abstracción. En el caso mínimo, puede seleccionar solo un par de líneas y descartar todo el resto (perder irrevocablemente) y se conservarán todos los principios de pensamiento. Dada la capacidad de perder resultados, es posible organizar una etapa de selección adicional, en la cual, de alguna manera racional, por ejemplo, de acuerdo con la significación estadística, seleccionar contenido para cálculos posteriores.
2. El segundo truco se basa en el supuesto de que cuanto más se colocan los corchetes en la línea, menos organizado es el contenido que contienen. En consecuencia, el contenido "emergente" como resultado de los corchetes es más organizado y abstracto desde el punto de vista de los significados internos de Kolya, lo que significa que se pueden eliminar los niveles profundos de anidación. Por lo tanto, la cantidad de cálculo en la siguiente iteración disminuye exponencialmente. En un sentido intuitivo, este procedimiento le permite aproximar solo la parte más abstracta del pensamiento.
3. Como resultado de la paralelización a muchas ramas más pequeñas, los cálculos crecerán "en ancho". Este ancho puede estar absolutamente limitado por la selección no solo a nivel de ramas de computación individuales, sino también en toda la gama de ramas paralelas. Esto se puede hacer a través de un grupo común de un tamaño fijo, desde donde cada rama dibujará líneas para la próxima iteración y, en consecuencia, donde volcará los resultados. Y para las cadenas, puede limitar absolutamente el nivel permitido de anidamiento de corchetes. Tal enfoque combinado ayudará a frenar y regular el crecimiento del volumen de cálculos.
Interpretación y comentario
Evidencia No hay evidencia y no puede ser. Cualquier teoría del pensamiento es una cuestión de definición. El algoritmo presentado es una teoría constructiva del pensamiento. Y por lo tanto él es un axioma. El algoritmo de pensamiento es apodícticamente reconocible para el sujeto del pensamiento. El reconocimiento se puede facilitar recurriendo primero a una axiomática no constructiva que sea más intuitiva, y luego encuentre la coincidencia de las propiedades de las definiciones constructivas y no constructivas.
Definición no constructiva del pensamiento . Pensar no es una producción algorítmica de contenido. En una comprensión intuitiva, los fenómenos no algorítmicos tienen las siguientes características específicas: independencia, espontaneidad, singularidad, autoorganización, arbitrariedad, subjetividad, complejidad, imprevisibilidad fundamental e incertidumbre, la ausencia de barreras conceptuales y, en el sentido más amplio, una posibilidad inherente y duradera de novedad fundamental. Todas las características enumeradas son de alguna manera inherentes al algoritmo de pensamiento descrito. Aunque la combinación de un algoritmo y propiedades no algorítmicas no es intuitiva y a primera vista es contradictoria, de hecho no hay contradicción. El algoritmo despliega contenido utilizando procedimientos algorítmicos bien definidos, pero en el proceso de implementación, el contenido tiene una organización no algorítmica. Dados los detalles de diseño del algoritmo, las propiedades no alergítmicas en la organización del contenido se derivan de las propiedades propias, internas y no algorítmicas del contenido mismo.
Puntos de vista adicionales sobre el algoritmo . El algoritmo de pensamiento es, que incluye:
1. Implementación constructiva de una metáfora. Pensar es esencialmente metafórico. No hay otros significados además de figurativo (posible). Sin embargo, en sentido figurado, son posibles los significados literales (algoritmos).
2. Modelo de autoorganización del caos absoluto. Un modelo de espontaneidad conceptual.
3. Un modelo de comportamiento completamente independiente, subjetivamente motivado. Modelo de creatividad.
4. Lenguaje autoorganizado.
5. El modelo de aproximación constructiva, para la semántica no constructiva, puramente posible.
Conciencia La cuestión de la conciencia también se resuelve a nivel de definición. La conciencia es algo que se encuentra más allá de cualquier limitación conceptual. A la luz de tal definición, uno solo puede envenenar historias más o menos complicadas sobre la conciencia, cada una de las cuales reflejará algunas posibilidades de conciencia, pero ninguna de ellas será verdadera. Al mismo tiempo, las historias sobre la conciencia tienen potenciales heurísticos diferentes. De todos los cuentos, los que son más difíciles son más útiles. Desde el punto de vista de los algoritmos, la conciencia es un objeto trans-algorítmico, infinitamente complejo (o simplemente complejo). Un cuento de conciencia se puede grabar usando un algoritmo. Suena así:
lim n → ∞ [t n + 1 = composición [ abstracción [ deducción [t n ]]]]; t 0 = s; t n , s ∈ S ; n ∈ N