Autor Tema: Comentarios a "La Aritmética Recursiva Primitiva"

0 Usuarios y 1 Visitante están viendo este tema.

18 Junio, 2023, 03:13 pm
Respuesta #70

Carlos Ivorra

  • Administrador
  • Mensajes: 11,883
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
    • Página web personal
Lamentablemente tengo que volver al asunto de las comillas.

Pues vamos allá.

La cuestión es que si uno intenta hacer un programa de computadora,
ya no hay signos, sino caracteres, y las comillas se usan con otro significado,
que puede llegar a ser justo el opuesto del uso gramatical dado en este hilo.

¿Y eso qué tiene que ver? El uso de las comillas que he explicado en este hilo, es un apéndice, si quieres llamarlo así, a la gramática española. Sirve para que un lector de este hilo interprete correctamente las frases que puede leer en él. Por ejemplo, tú leías "0 es un signo de ARP" y te sorprendías porque yo decía que eso es verdadero y pensabas que antes yo había dicho justo lo contrario, porque no interpretabas correctamente las frases

0 es un signo de ARP.

"0" es un signo de ARP.

Pero ahora ya sabes cómo hay que entender cada una de ellas (por el uso de las comillas que hacemos al hablar en español en este hilo) y no dudarás en afirmar que la primera es verdadera y la segunda falsa. Si es así, entiendes perfectamente el uso de las comillas en la jerga española que usamos en este hilo.

Ahora bien, en todo lo que sigue estás mezclando el lenguaje C con el español. Si escribes en C, tendrás que usar la gramática de C, no la gramática española. ¿Qué sentido tiene comparar cómo se dice algo en español y cómo se dice en C?

Si traduces a C algo dicho en español, como "multiplica todos los números desde el 1 hasta un n dado", la traducción no se parecerá en nada a la frase española. No puedes buscar cómo se dice en C "hasta" o "todos". No habrá ninguna correspondencia superficial entre la forma de expresar la instrucción en español y la forma de expresarla en C. Igualmente, tú estás buscando analogías entre dos cosas que no tienen nada que ver.

Lo cual me hace dar cuenta por qué me enredé en esa discusión.
En contextos diferentes hay que ver cómo se traducen las cosas correctamente.

Ya que hemos convenido que los signos de \(L_{arp}\) significarán 8 entidades del Universo,
voy a elegir a esas entidades como ocho fichas que tienen pintados los octetos en binario que son códigos ASCII o UNICODE de los caracteres cuyo glifo luce como los signos de  \(L_{arp}\).
Además, los signos "\(\kappa\)" y "\(\rho\)" los he cambiado por sus versiones latinas "k" y "r", porque son más accesibles en ASCII, y además yo puedo elegir los elementos que yo quiera para mi conjunto.  >:(

No sé dónde dices que has cambiado eso, porque en todo lo que sigue no mencionas ningún nombre de ningún signo. Sólo usas tus propios signos. En tu conjunto no has puesto ni \( r \) ni \( \rho \). Has puesto cadenas de ceros y unos. No le veo sentido a que digas que puedes usar "k" y "r" porque puedes elegir los signos que quieras para tu conjunto y luego definas un conjunto en el que no usas ni "k" ni "r". No es que sea importante en sí mismo, pero parece indicar que tienes alguna confusión de fondo.

He aquí los objetos de mi conjunto de ocho elementos:
\[
\fbox{00110000},\fbox{01010011},\fbox{01110000},\fbox{01100011},
\fbox{01101011},\fbox{01110010},\fbox{01111000},\fbox{00111101}.
\]

Bien. Puedes elegir los que tú quieras.

Podría haber elegido otros objetos, pero quiero mantener el símil con la representación en memoria, porque esa será la implementación real después de todo.

Es cierto que puedes elegir los signos que quieras, y precisamente por eso, pensando en implementar \( \mathcal L_{\rm arp} \) en un ordenador, usar esos nombres que has elegido es lo menos eficiente que podrías haber hecho. Hubiera sido mucho más eficiente que eligieras ocho caracteres que no ocho cadenas de ocho caracteres cada una. Pero eso ya es cuestión de gustos (y de que no te importe la eficiencia al programar).

Por la manera que hemos llevado la discusión, pareciera que no puedo nunca poner explícitamente en forma escrita esos objetos, porque al ser signos,
van entre comillas, puesto que estoy hablando de ellos.

Es como decir que no puedes poner explícitamente en forma escrita ninguna palabra inglesa, porque al no ser palabras españolas, van entre comillas. Eso es cierto si hablas en español. Entonces, con nuestro convenio, tienes que decir que "red" es un adjetivo y que "mountain" es un sustantivo. Pero puedes usar esas palabras sin comillas simplemente escribiendo en inglés. Si escribes en inglés, tendrás que poner entre comillas las palabras españolas que menciones, pero no las inglesas.

Igualmente podrías escribir un libro en el lenguaje \( \mathcal L_{\rm arp} \) que, con los signos que has elegido, sería una sucesión de líneas, cada una de las cuales sólo tendría ceros y unos. En ese caso, si el libro está escrito en \( \mathcal L_{\rm arp} \) (no en español), no tendrías que poner nunca comillas, entre otras cosas porque las comillas no son signos de \( \mathcal L_{\rm arp} \).

En todo caso, si escribieras un libro bilingüe, con las páginas pares en \( \mathcal L_{\rm arp} \) y las impares en español, sólo tendrías que usar comillas en las páginas impares cuando hicieras referencia a algún pasaje de una página impar.

Pero bueno. No sé. No puedo poner una fotografía entre comillas, ni un audio de Beethoven entre comillas.

Porque es algo muy excepcional que hablando en un idioma puedas intercalar en el texto el objeto del que hablas.

Acá solamente estoy ilustrando gráficamente que me estoy refiriendo
a unas supuestas fichas con octetos binarios pintados en el lomo,
y que andan por ahí.

De hecho, lo cierto es que no serán fichas, sino una configuración electrónica de una tarjeta RAM, que en ocho posiciones consecutivas adquiere un voltaje alto o bajo (los famosos bits de un byte).

Ese byte, en su forma electrónica del mundo real, digamos,
serán los signos de \(L_{arp}\).

No es nada práctico tomar como signos cosas que no se pueden escribir en un papel (o en una pantalla de ordenador). Aunque teóricamente es posible, estás rozando el ejemplo que puse de tomar como signo "una representación del Everest a escala 1:1".

Si quieres programar un ordenador para que manipule signos, sería preferible que, dentro de tu libertar para elegir los signos que quieras, elijas unos que estén en el teclado de tu ordenador.

Al mismo tiempo, son unidades de información en el entorno de ejecución de un programa escrito en C o en C++ (a estos efectos, ambos lenguajes tienen especificaciones parecidas).

Pero eso es como usar una calculadora para clavar un clavo en una pared. Puedes usarla (si es lo suficientemente resistente y no te importa que deje de funcionar), pero no está pensada para eso. Cualquier lenguaje de programación está preparado para entender como signos los caracteres que sabe manejar. Si tienes un lenguaje que entiende el código ASCII, ¿por qué no usas como signos caracteres del código ASCII y aprovechas las capacidades del lenguaje de programación que tienes? Lo que haces sólo tendría sentido si estuvieras programando una CPU usando lenguaje máquina, y te vieras obligado a hacer referencias directas a las posiciones de memoria en la RAM o en el disco duro.

Ahora bien, en el entorno de ejecución de un programa
uno no tiene cadenas de caracteres,
sino arrays (posiciones contiguas de memoria) de bytes.

En tanto y en cuenta se tomen como lo que son,
a saber, bytes, o bien se amontonen como arrays de bytes sin significado alguno,
no veo necesidad de que lleven comillas, pues estoy usando las figuras en los rectángulos
para representar a esos objetos por sí mismos (serían su propio significado  ;D ).

Cuando quiera usarles para representar el número tres, ahí si los entrecomillaríamos:

Eso no tiene ningún sentido. Es como si te planteas cómo es en C la tercera persona del singular del pretérito imperfecto de indicativo del verbo "sumar". El lenguaje C te permite sumar, pero no puedes expresar en él conceptos gramaticales como "persona", "número", "pretérito imperfecto", etc., e igualmente no tiene ningún sentido que busques en C un elemento gramatical del español como son las comillas.

En todo caso, eso te debería preocupar si quieres que tu programa en C genere una respuesta para el usuario del tipo: "El número que has introducido es impar". Ahí puedes preocuparte de que C escriba "número" con acento en la u, y cosas parecidas, pero eso para C no son más que cadenas de caracteres que imprime cuando le dices que lo haga, sin entender nada de que las palabras esdrújulas llevan acento.

El siguiente array de bytes

"\(\fbox{01010011}\fbox{01010011}\fbox{01010011}\fbox{00110000}\)"

significará el número natural tres.

Y acá es donde yo veo importante distinguir entre un signo y una cadena de signos de longitud 1.

Puede que tu implementación en un ordenador requiera hacer la distinción, como se requiere en muchos contextos de la matemática formal, pero si simplemente quieres hablar de tus signos, sin preocuparte de cómo los tiene que entender un ordenador, no hay necesidad de establecer la distinción. De hecho, nada te impide programar un ordenador para que tome como signos determinadas cadenas de caracteres de longitud 1, de modo que las cadenas de signos serán cadenas de caracteres de longitud mayor o igual que 1. Y con esa implementación los signos serán cadenas de signos de longitud 1, literalmente.

Y es que si yo me refiero a \(\fbox{01010011}\)
como un objeto que pertenece a un conjunto,
no le veo sentido tener que ponerle comillas.

Pero es que ahí estás introduciendo una distorsión en todo el asunto, porque pretendes que tus signos sean algo que no se puede escribir en un papel, por lo que en el fondo (y no estoy seguro de que con total coherencia), estás usando "\(\fbox{01010011}\)", no como uno de tus signos, sino como un nombre que le das en español a uno de tus signos, el cual no puede ponerse en un papel por la misma razón que no podrías si hubieras tomado como signo un audio de Beethoven.

Y una vez más mi diagnóstico es que tu problema es que tratas de trabajar con una generalidad inmanejable amparándote en la ambigüedad inherente a conceptos básicos como el de "signo". La cuestión no es qué hacer con tus signos que fuerzan todo por su imposibilidad de representarlos en un papel. La cuestión es, ¿y si en vez de tomar esos signos abstractos con los que es tan difícil trabajar y que te generan tantos problemas filosóficos tomas como signos "a", "b", "c", "d", "e", "f", "g", "h", en qué quedan todos tus problemas?

Imagina que, en lugar de darte libertad para que elijas los signos que quieras, yo hubiera empezado el hilo diciendo: tomaremos como signos de \( \mathcal L_{\rm arp} \) los ocho signos siguientes:

"a", "b", "c", "d", "e", "f", "g", "h"

a los cuales nos referiremos con los nombres siguientes, respectivamente:

0,  S,  p,  c,  \( \kappa \),  \( \rho \),    x,    =.

Sólo con que hubiera empezado así, te podría decir que todo lo que estás diciendo no viene a cuento, porque los signos de \( \mathcal L_{\rm arp} \) no son los que tú has elegido, sino que son los ocho que he dicho yo.

Si he dicho que los signos pueden ser cualesquiera, es porque no importa si alguien, en lugar de

"a", "b", "c", "d", "e", "f", "g", "h"

prefiere

"x", "y", "ñ", "s", "tt", "8", "?", "+"

pero una cosa es no concretar algo cuya especificación es irrelevante y otra muy distinta que aproveches la ambigüedad de la palabra "signo" que admite muchos ejemplos claramente manejables para meter unos signos tan abstractos que te generan toda clase de dudas filosóficas.

Insisto en que lo más sencillo si te vas a poner a filosofar así, es que modifiques el primer mensaje en el que hablo de ARP y consideres que los signos de ARP son, por definición,

"a", "b", "c", "d", "e", "f", "g", "h"

y así desaparecen todos tus problemas. Lo que ocurre es que en realidad esa restricción es arbitraria e innecesaria, mientras tomes como signos cualquier otro juego alternativo de signos que sean fácilmente manejables, como ocho caracteres cualesquiera de los que un ordenador sabe manejar.

Pero, volviendo a lo que planteas, si entendemos que "\(\fbox{01010011}\)" es realmente el nombre que usas para referirte a un signo abstracto (que para ti es un estado posible de una posición de memoria de un ordenador), entonces, efectivamente, "\(\fbox{01010011}\)" no necesita comillas, porque no es realmente uno de tus signos (porque has tenido la idea peregrina de elegir signos que no caben en un papel), sino que es el nombre en español que le das a uno de tus signos. Si lo entendemos así, habría que decir que \(\fbox{01010011}\) es un signo de \( \mathcal L_{\rm arp} \), el mismo al que también podemos llamar "S", si no me he confundido al mirar tu lista. Así, podríamos decir que

\(\fbox{01010011}\) es un signo de \( \mathcal L_{\rm arp} \), también llamado S.

Sin poner comillas, y con esto no estoy cambiando el criterio que expliqué en los mensajes anteriores, sino que lo estoy siguiendo al pie de la letra. Tú tienes que decidir si  "\(\fbox{01010011}\)"  tiene sentido hablando en español. Si me dices que tiene sentido, y que es la forma que tienes de nombrar uno de tu signos abstractos, entonces yo te digo que lo que procede es escribir

\(\fbox{01010011}\) es un signo de \( \mathcal L_{\rm arp} \)

sin comillas. Pero entonces también te digo que

"\(\fbox{01010011}\)" no es un signo de \( \mathcal L_{\rm arp} \), sino que es el nombre que le has dado a uno de los signos de \( \mathcal L_{\rm arp} \), un nombre inútil, porque sería más práctico que te refirieras a él como "S", ya que, así, "\(\fbox{01010011}\)" y "S" son sinónimos. Son dos formas de nombrar un signo que no podemos poner entre comillas porque no cabe en un papel, o en una pantalla de ordenador.

Su significado es el de un octeto de ocho bits,

Si te refieres a su significado en español, entonces es como te digo, no tienes que ponerle comillas, porque ya es una palabra española que nombra a un signo que no puedes escribir con comillas porque has tenido la idea peregrina de tomar como signo algo no imprimible. Es teóricamente posible porque nunca necesitaremos imprimir o escribir los signos, pero eso te genera todas las confusiones que te está generando.

y como tal no tiene sentido decir que es una cadena de signos de longitud 1.

¿Por qué no tiene sentido? Eso sí, ¿me hablas de "\(\fbox{01010011}\)" o de \(\fbox{01010011}\)? Porque lo que yo te digo es que \(\fbox{01010011}\) es una cadena de signos de longitud 1, mientras que "\(\fbox{01010011}\)" no lo es, sino que es un nombre peregrino que has dado en español a uno de tus signos no imprimibles. Es como si hubieras tomado como signo un carácter ASCII no imprimible, que los hay, como bien sabrás.

Sólo cuando tengo la intención de usarlo como signo es que puedo
decir que tiene el atributo de longitud igual a 1.

Mala cosa sería que un atributo de algo dependiera de nuestras intenciones. Muy poco objetivo sería ese atributo. Una vez has decidido que un signo de tu lenguaje sea una cosa no imprimible a la que podemos llamar  "\(\fbox{01010011}\)" o "S", podemos decir que

 \(\fbox{01010011}\) (o, lo que es lo mismo, S) es una cadena de signos de longitud 1, pero eso no contradice que  "\(\fbox{01010011}\)" no sea una cadena de signos de longitud 1. Se trata de un nombre que puedes identificar con una cadena de signos de otro alfabeto (cuyos signos son "0" y "1") y entonces es una cadena de signos de longitud 8. En otras palabras, estás nombrando un signo (o una cadena de signos de longitud 1) de \( \mathcal L_{\rm arp} \)) con una cadena de signos de longitud 8 de otro alfabeto.

El símil aquí sería decidir mirar un trozo de memoria RAM como una sucesión de bytes,
en cuyo caso se podría hablar de la longitud del array de bytes en cuestión.

No sé si no me pierdo ya aquí, pero tal vez estás diciendo lo mismo que acabo de decir, que si tomas como uno de tus signos un array de bytes, entonces una cosa es que ese array de bytes es una cadena de signos de \( \mathcal L_{\rm arp} \) de longitud 1, lo cual no tiene nada que ver con que el signo tenga otra longitud como array de bytes.

Es como si tomo como signo S esto: "suc". Entonces "suc" es un signo de \( \mathcal L_{\rm arp} \), luego es una cadena de signos de longitud 1, y eso no está reñido con que el signo conste de tres letras latinas.

Puede ser un poco extraño, luego,
decir que el significado de una sucesión de bytes es una entidad mental,
como el caso del número natural tres.

No veo qué tiene de extraño.

La computadora no tiene manera de hacer esa asociación
(aunque Elon Musk anda cerca de lograrlo).  >:D
Así que ese significado habría que dárselo, todavía, sólo desde la mente.

Es que ésa es la gracia del asunto, que una computadora pueda manejar el lenguaje de \( \mathcal L_{\rm arp} \) sin necesidad de que sepa nada sobre el significado de las cadenas de signos que maneja.

En cualquier caso, al menos creo haber logrado
dar con lo que sería la manera correcta de una representación
en computadora de los signos del lenguaje formal, como se explican en el hilo.

No. Lo que has hecho ha sido desvirtuar toda la teoría tomando como signos unos objetos que están en el límite de lo que es aceptable tomar como signos. Lo razonable sería que tomaras como signos ocho caracteres Unicode, si te preocupa tanto la precisión. Si no te preocupara tanto, te diría que podrías tomar ocho garabatos cualesquiera que pudieras hacer en un papel con la condición de que al leerlos tuvieras claro cuál es cual.

No obstante, quiero notar acá que, cuando agrego comillas para hablar
del array de bytes per se, y sus propiedades como array (que serían equivalentes a las propiedades de una sucesión de signos),
no son comillas que pondría en la memoria RAM.
Es decir, no usaría bytes extra para representar comillas ahí.

Son comillas mentales, por decirlo así, o que podría poner acá en el texto escrito,
puesto que son comillas del lenguaje español,
y no algo que tenga sentido en la memoria RAM, ni tampoco en la sintaxis del lenguaje de programación.

Es que plantear que el ordenador use comillas es como plantear que el ordenador tiene que conjugar verbos y establecer concordancias de género y número entre sustantivos y adjetivos. No sé en qué están pensando para pretender que un ordenador maneje conceptos de la gramática española. Eso sólo tendría sentido si estuvieras programando a un ordenador para que lea textos en español y los entienda, pero eso está muy lejos de lo que estamos considerando aquí. Sólo estamos hablando de que un ordenador maneje correctamente el lenguaje \( \mathcal L_{\rm arp} \), no que sea capaz de leer un hilo en español en el que se habla de dicho lenguaje. Sólo para esto haría falta instruir al ordenador sobre el uso de las comillas.

Ahora bien.
En el código fuente de un programa en C o C++,
uno puede especificar arrays de bytes de varias maneras,
pero la manera más sencilla es por medio de una construcción sintáctica
denominada cadena literal.

Aquí, llamativamente, se usan comillas dobles para denotar una cadena literal.

Estamos, pues, ahora en terreno sintáctico, vale decir,
en lo que se denomina entorno de traducción,
que es donde se especifican las reglas del lenguaje C o C++.

No sé si me pierdo, pero me parece que estás tratando de traducir a C la gramática española. Si yo te describo un algoritmo, como "Dados dos números naturales, calcula su máximo común divisor", no pretenderás implementar en C el uso de las palabras "Dados", "dos", "números", etc., ni en qué queda la coma que he puesto a mitad de la frase, etc. Sencillamente, el algoritmo que hagas hará lo que se le pide, pero no verás en el rastro de que "Dados" es un participio masculino plural del verbo "dar" ni nada de todo esto, igual que no puedes esperar ver unas comillas en un programa en C. En un programa en C usarás las comillas como requiere la gramática de C y para lo que ésta lo requiere. No puedes esperar ver ahí ningún reflejo de los convenios gramaticales apropiados para un hilo que habla de \( \mathcal L_{\rm arp} \).

Una cadena literal es una construcción sintáctica
por la cual una sucesión finita de caracteres se encierran entre comillas dobles.
Así, "hola" es una cadena literal, y también lo es "otro-ejemplo".

Si hablo de la cadena literal "hola", estoy refiriéndome a un objeto
del lado sintáctico del lenguaje de programación que esté usando.

Lo que me llama la atención es que puedo hablar de ella,
al igual que Carlos dice que uno puede hablar de una palabra entrecomillada,
diciendo por ejemplo que "hola" tiene cuatro letras,
mientras en C uno diría que la cadena literal "hola" tiene 4 caracteres.

Y al igual que "Sp" (en el idioma de Ivorra)
no es la cadena de signos formada por una ese y una pe,
la cadena literal "Sp" en C ó C++
no es lo mismo que el array que contiene los bytes \(\fbox{01010011},\fbox{01110000}\).

Si bien la analogía parece coincidir,
creo que es pura casualidad hasta acá,
y los contextos son diferentes.

En cuanto a lo que el lenguaje C se refiere,
lo que sucede es bien concreto:
el compilador de C, al ejecutarse,
realiza una traducción del objeto sintáctico "Sp", digamos,
y lo convierte en el array de bytes: \(\fbox{01010011},\fbox{01110000}\).

Así, una cadena literal (que siempre va entrecomillada)
se traduce en un array de bytes.

Y creo yo que entre ambos contextos, el idioma español y el lenguaje C,
puede mantenerse hasta aquí un paralelismo que funciona bien.

____________________________________________

Sin embargo, en la exposición de Carlos sucede algo diferente,
y es que a las cadenas de signos se le dan nombres,
que serían palabras nuevas para nombrar entidades que serán,
después de todo, sucesiones finitas de signos,
y que en el contexto de programación serían arrays de bytes.

En C ó C++ también puede hacerse algo así,
mediante variables de tipo array de caracteres,
o de tipo puntero a caracteres.

No creo que nada de lo que dices aquí tenga ninguna relevancia. Estás comparando la gramática de C con la gramática española. Las diferencias serán muchas más que los parecidos, pero eso es anecdótico. Parece como si quisieras programar a un ordenador para que lea el hilo y lo entienda, cuando lo único relevante aquí es que es posible programar un ordenador para que maneje el lenguaje \( \mathcal L_{\rm arp} \) sin necesidad de entender nada, no ya del propio lenguaje —que también— sino mucho menos de la forma en que hablamos de él en español.

Así como Carlos usa la palabra SS0 para denotar la misma sucesión de signos que denotaría con la cadena "SS0",

Esto hace aguas por todas partes. Para empezar yo no uso SS0 (y nunca lo usaré) para denotar ninguna sucesión de signos. SS0 ES una sucesión de signos que puede usarse en \( \mathcal L_{\rm arp} \) para denotar el número natural dos.

En todo caso, puedes decir que uso la palabra "SS0" para denotar (obviamente) la misma sucesión de signos que denotaría con "SS0", aunque yo no llamaría cadena a "SS0", porque "SS0" no es una cadena de signos de \( \mathcal L_{\rm arp} \). Vale que podríamos decir que es una cadena de signos del alfabeto latino, pero mejor reservar la palabra "cadena" para las cadenas de signos de \( \mathcal L_{\rm arp} \).

análogamente nosotros usaríamos una variable SS0 para denotar el mismo array de bytes que denotaríamos con la cadena literal "SS0":

Pero es que no tiene ningún sentido que trates de establecer analogías entre la gramática española y la gramática de un lenguaje de programación. Cualquier parecido será pura coincidencia superficial y sin valor.


const char SS0[] = "SS0";


Acá me siento algo confundido,
si es que quiero mantener la analogía entre lo que explica Carlos
y que hace el lenguaje C.

¿Y por qué no buscas una analogía entre lo que hace el lenguaje C y la filosofía confuciana? Es que no tiene por qué haber ninguna analogía entre las gramáticas de dos lenguajes, y mucho menos si uno es un lenguaje natural y otro un lenguaje de programación.

Para empezar, en C no es exactamente lo mismo un identificador, como SS0,
que una cadena literal como "SS0".

De todas maneras, al traducir al entorno de ejecución,
ambos objetos sintácticos serán traducidos
al array de bytes \(\fbox{01010011} \fbox{01010011} \fbox{00110000}\).

Sin embargo Carlos diría que SS0 (en español) "es" el array de bytes \(\fbox{01010011} \fbox{01010011} \fbox{00110000}\)
mientras que "SS0" es una palabra de tres letras que, de paso,
se usará para representar un array de tres bytes, digamos.

En el lenguaje C, tanto SS0 como "SS0" son objetos sintácticos,
y que lleven comillas o no sólo indica que son objetos de clasificación sintáctica diferente
(un identificador y una cadena literal, respectivamente),
que luego tendrán la virtud de traducirse a la misma cosa.

Pero, por ejemplo, en C sería falso argumentar que el significado de "SS0" es SS0.

En cambio, el significado (la semántica en tiempo de ejecución del programa en C),
tanto de "SS0" como de SS0, es el mismo:
\(\fbox{01010011} \fbox{01010011} \fbox{00110000}\).

______________________


Para peor, el lenguaje C contiene en su especificación
un metalenguaje, que se llama preprocesador de C,
el cual tiene sus propias reglas,
y se usa para traducir un cierto código fuente a lenguaje C puro.

En este preprocesador uno puede estipular clásulas de sustitución, en forma de macros,
como las siguientes:


#define SSSS0 "SSSS0"


En este caso, el identificador SSSS0 se estaría usando,
en la etapa del procesador,
como una manera de expresar, como sinónimo, a la cadena literal "SSSS0".

Se podría decir que la semántica del indentificador SSSS0 es el objeto sintáctico "SSSS0".

Aquí estamos en una situación opuesta a la que se tiene en el hilo principal,
porque allí SSSS0 (en español) no es capaz de sustituir a la cadena entrecomillada "SSSS0",
ya que en realidad "es lo mismo que" (hablando español)
\(\fbox{01010011} \fbox{01010011} \fbox{01010011} \fbox{01010011}\fbox{00110000}\).

Todo esto se resume en la obviedad de que la gramática del lenguaje C no es la gramática española. También podrías añadir a tu comparación que en español hay tres conjugaciones verbales y en C no hay ninguna, etc., etc.

Lo que me chirría o preocupa en todo esto son aquellas ocasiones
en que Carlos afirma que todo esto se puede llevar a cabo en un ordenador.

En rigor, no es cierto.
Y me parece que hay que establecer claramente cómo se traduce de un contexto al otro.

Depende de a qué te refieres con "todo esto". Yo afirmo que es posible programar un ordenador para que opere con el lenguaje \( \mathcal L_{\rm arp} \), no para que entienda textos en español sobre el lenguaje de \( \mathcal L_{\rm arp} \).

De todos modos, sería más claro que no hicieras enmiendas a la totalidad de lo que diga, sino que concretaras cualquier cosa que yo diga y que te parezca dudosa. En este caso, ¿cuándo he dicho yo que algo es programable y tú lo cuestiones? Dime qué cosa digo yo que es programable y te escribiré un programa que lo demuestre. 

Por ejemplo, hasta ahora no has aludido a nada del hilo que sea posterior a la definición de los signos de \( \mathcal L_{\rm arp} \) y de las cadenas de signos. Te pongo a continuación un programa en Python que hace todo lo que tiene sentido hacer con estos únicos conceptos: le das una entrada y el programa te dice si es o no una cadena de signos de \( \mathcal L_{\rm arp} \) y, en caso afirmativo, cuál es su nombre y su longitud.

Voy a tomar como signos de \( \mathcal L_{\rm arp} \) los que tú has elegido (aunque eso supone una complicación innecesaria en la antítesis de la eficiencia, pues sería mucho más práctico tomar como signos ocho caracteres imprimibles cualesquiera). Eso sí, yo estoy entendiendo que "\(\fbox{01010011}\)" es literalmente un signo de \( \mathcal L_{\rm arp} \) y no el nombre de un signo, que es lo que en el fondo estabas considerando tú. (En realidad omitiré el recuadro, porque eso no se puede introducir con el teclado.)

El programa es éste:

Código: [Seleccionar]
nombre = {"00110000" : "0", "01010011" : "S", "01110000" : "p",
          "01100011": "c", "01101011" : "\u03ba", "01110010" : "\u03c1",
          "01111000" : "x", "00111101" : "="}
signos = tuple(nombre.keys())
entrada = input("Escribe una cadena de signos: ")

def primersigno(c):
    """Separa el primer signo de la cadena c del resto de la cadena."""
    lectura = ""
    for s in signos:
        if c.startswith(s):
            lectura = s
    if lectura != "":
        resto = c[len(lectura):]
    else:
        resto = c
    return (lectura, resto)

def lee(c):
    """Calcula el nombre de la cadena c hasta donde tiene sentido y
devuelve un resto con lo que no ha podido interpretar."""
    pendiente = True
    resto = c
    lectura = ""
    while pendiente:
        p = primersigno(resto)
        if p[0] == "":
            pendiente = False
        else:
            lectura = lectura + nombre[p[0]]
            resto = p[1]
            if resto == "":
                pendiente = False
    return (lectura, resto)

l = lee(entrada)

if entrada != "":
    print("""Has escrito "{}".""".format(entrada))
    if l[1] == "":
        print("""Se trata de la cadena de signos {}, de longitud {}."""\
              .format(l[0],len(l[0])))
    elif l[0] != "":
        print("""Eso no es una cadena de signos de ARP.
Empieza por {}, pero tiene un resto "{}" sin sentido.""".format(l[0], l[1]))
    else: print("""Eso no es una cadena de signos de ARP.""")

Empieza con un diccionario que asigna a cada uno de tus signos su nombre en español (donde introduzco \( \kappa, \rho \) a través de sus nombres en Unicode. Si prefieres usar unos signos distintos, sólo tienes que modificar ese diccionario y el resto del programa vale igual, porque los signos concretos que elijas son irrelevantes para todo. He aquí un par de ejemplos de su funcionamiento:

Código: [Seleccionar]
=================== RESTART: /Users/ivorra/Desktop/Arg.py ===================
Escribe una cadena de signos: 011010110101001101100011010100110101001100110000
Has escrito "011010110101001101100011010100110101001100110000".
Se trata de la cadena de signos κScSS0, de longitud 6.
>>>
=================== RESTART: /Users/ivorra/Desktop/Arg.py ===================
Escribe una cadena de signos: 01110010011100101111101100011
Has escrito "01110010011100101111101100011".
Eso no es una cadena de signos de ARP.
Empieza por ρρ, pero tiene un resto "1111101100011" sin sentido.
>>>

Como ves, la salida del programa está en español (lo cual no significa que el programa entienda el español, sino que son respuestas enlatadas con sintaxis prefijada) y respeta perfectamente el criterio sobre el uso de comillas.

Si yo digo que es posible programar a un ordenador para que determine si una entrada dada es o no una cadena de signos y que, en su caso, escriba su nombre y calcule su longitud, me refiero ni más ni menos que a lo que acabo de hacer, y ya está hecho, y el uso de las comillas en la respuesta en español enlatado no han sido ningún problema.

Lo más que podría añadir (sin salir de la porción del hilo de la que me estás hablando) es una función que yuxtaponga dos cadenas dadas, pero eso tampoco ofrece ninguna dificultad.

¿En qué quedan todas las dificultades filosóficas que has discutido en tu mensaje?

Cuando avances un poco más en el hilo, podremos programar también un algoritmo para que el ordenador decida si una cadena dada es o no un numeral, y en tal caso que escriba su nombre, y luego si es o no un funtor y de qué rango, etc. Todo eso lo puede hacer sin dificultad un ordenador y no hay ningún problema en que dé su respuesta en español enlatado poniendo las comillas que toca igual que pondrá acentos en las palabras que lo requieran.

Eso sí, el programa está escrito en Pyhon y sigue la sintaxis de Python. No trates de buscar en las instrucciones del programa ningún rastro de la gramática española (más allá de las cadenas con las respuestas enlatadas), porque las comillas se usan como lo requiere Python y no como en español, por lo que no verás los usos de las comillas en español igual que no verás conjugaciones ni verbos ni nada parecido.

Por supuesto, es un programa en Python y es correcto porque hace lo que se espera que haga. Y eso es totalmente independiente de dónde y cómo guarda el ordenador la cadena de signos que se le introduce. Estaría bien aunque no existiera en el mundo ningún ordenador implementado para ejecutar un programa Pyhton. Si dentro de mil años la humanidad desconoce por completo cómo funcionaban los ordenadores y cómo era posible que un ordenador leyera un programa en Python y lo ejecutara, cualquiera que leyera un libro que explique la sintaxis de Python (sin decir nada de qué hace un ordenador para ejecutar un programa) podría mirar mi programa y reconocer que sirve para determinar si una cadena dada es o no una cadena de signos de \( \mathcal L_{\rm arp} \) y en caso afirmativo calcule su nombre, y todo ello aunque dicha persona del futuro fuera incapaz de construir un ordenador que ejecute el programa.

Por eso, cualquier consideración sobre qué hace un ordenador para almacenar los signos y las cadenas de signos, es totalmente irrelevante para lo que nos ocupa. Cuando hablo de que un ordenador puede hacer tal o cual cosa, me refiero únicamente a que es posible diseñar un programa en un lenguaje de programación que haga tal cosa, con independencia de que existan o no ordenadores que lo ejecuten. Lo que importa es que la existencia del algoritmo garantiza que el concepto está definido objetivamente.

18 Junio, 2023, 05:25 pm
Respuesta #71

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,796
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
Lamentablemente tengo que volver al asunto de las comillas.

La cuestión es que si uno intenta hacer un programa de computadora,
ya no hay signos, sino caracteres, y las comillas se usan con otro significado,
que puede llegar a ser justo el opuesto del uso gramatical dado en este hilo.


No te he leído despacio (después lo hago) pero viendo por dónde va la cosa quizá sirva, para diferenciar esta cuestión al programar, el hecho de que una variable alfanumérica tipo “a” no se puede convertir a int, es decir, int (“a”) da error, mientras que si es alfanumérica del tipo “5”, entonces int(“5”) no da error; sería similar a convertir un nombre en singo quitándole las comillas
(sólo es una idea preliminar, no sé si te servirá para algo).
Saludos.

Pues acá nada da error, no va por ahí la cosa.

Lo que digo es que cuando Carlos habla del significado de una cadena de signos,
y también habla de  cadenas de signos,
está usando el español como metalenguaje.

Los signos, además, se interpretan más bien en un sentido, digamos, humanista,
o sea, signos lingüísticos, como lo interpretaría Saussure o algún especialista en semiótica.
El significado de un signo lingüístico es una idea
(que luego puede representar un objeto de la realidad, digamos),
aunque lo hemos estado conversando como si el signo representara directamente objetos de la realidad,
ya que después de todo, creo yo que agregar ese escalón intermedio no aporta demasiado a la discusión.

De hecho, cuando Carlos dice que tal o cual sucesión de signos significa el número natural cinco, pues resulta que ese cinco es una idea, no algo tangible.

_______________

En cambio, en programación no hay signos, sino bytes, digamos.

Los humanos nos enviamos informaciòn unos a otros mediante convenciones uniformes
usando unas unidades que serían los dichosos signos.

Pero las computadoras no se envían signos, ni cadenas de signos,
sino que se envían sucesiones de bytes.

Otros aparatos, como las radios, se envían entre sí unas secuencias de ondas electromagnéticas,
las cuales no son signos humanos, ni bytes de computadora.

Por eso, en cada contexto, el método de transmitir información no sólo es diferente,
sino que creo que hay que observar con detenimiento cómo
es que se traducen las cosas de un contexto al otro.

Es posible que la traducción de un sistema a otro no sea perfecta.

En esta discusión creo que sí hay chances de una traducción del contexto
de los signos del lenguaje humano (español)
al contexto de bytes entre computadoras,
porque se trata de un conjunto pequeño y concreto de signos,
que admiten digitalización, ya que se presume que se distinguen claramente entre sí.

________________


Ahora bien.

Cuando nos comunicamos mediante signos del habla humana,
no vemos directamente el significado, es decir, la idea subyacente.
Si me hablas de una vaca, yo no veo la vaca que te estás imaginando,
sino que me llega el signo "vaca",
tras lo cual yo represento internamente en mi mente mi propia idea de lo que es una vaca.

Los signos se trasmiten, pues son una convención universal,
pero las ideas en-sí-mismas no se transmiten, pues son algo íntimo.
No existe, hoy día, transmisiión directamente de pensamiento.

Lo mismo pasa con las computadoras.
Cada máquina o dispositivo representa dentro de sí cierta información
mediante alguna tecnología.
Y luego, se transmiten entre sí sucesiones de bytes.

Una memoria RAM almacenará esos bytes en forma electrónica,
y la sostendrá en el tiempo con refresques repetitivos,
mientras que un disco del tipo CD-ROM mantiene los datos
en forma de impresiones de surcos microscópicos
sobre una superficie adecuada, la cual recibió los datos en forma de haces de luz láser,
y no de manera electrónica.

__________________

Aún así, aunque los signos son universales,
no son algo demasiado tangible tampoco,
ya que son una abstracción.
Si alguien te escribe una carta a mano, ninunga de sus letras "a" van a coincidir,
y sin embargo podrás leer cada una de las veces que ocurre la letra "a"
como el signo "a", sin problemas.

Pero esto nos dice que el signo "a" es una abstracción.
Pues no hay ningún dibujo de la letra "a" que sea el estándar, el original, el modelo-a-seguir.
Sino que todos hemos aprendido una manera de reconocer que ciertos dibujos,
pues corresponden al signo "a", y otros no corresponden.
Ese concepto de signo es una abstracción que no podemos dibujar de manera concreta.

Lo análogo sucede con los bytes, ya que un byte,
que sería un octeto ordenado de bits,
se puede representar de diversas maneras,
en forma electrónica, en forma lumínica, en forma de surcos en un CD-ROM, etc.,
y todos ellos se toman como equivalentes, de acuerdo a la convención de que todas esas
son formas de representar una cosa general, abstracta, que llamamos byte.

_____________________

La dificultad adicional que se agregue en toda esta discusión
es que ahora no solamente usamos signos,
sino que además estamos hablando acerca de los signos mismos.
Por un lado, se usan ellos para significar algo,
y por otro lado, nos referimos a ellos como objeto de estudio en sí mismo,
pues se analiza qué relación entre las cadenas de signos
y los significados matemáticos que se les van a asignar.

Para poder hablar de los signos se usa, digamos, el lenguaje español,
para lo cual requerimos también usar otros signos,
o incluso entremezclar los mismos signos a los cuales nos referiremos,
y hay que distinguir cuándo el signo se usa para transmitir su significado,
y cuándo se usa como objeto de estudio per se,
de modo que podamos decir por ejemplo que
una cadena de signos dada tiene longitud ochenta.

Pues bien. Ya que me tomé antes el trabajo de ver cómo traducir del contexto
del habla humana al contexto informático,
y entender qué deberíamos entender por el símil de un signo,
resulta que también ahora hay que ver cómo traducir
la manera en que hablamos de cadenas de signos per se
(esto es lo que llamaríamos meta-teoría de \(L_{arp}\).

En programación no hay meta-teorías,
pero sí hay lenguajes de programación,
que no entienden directamente de bytes,
sino que permiten expresar ciertas cosas
de modo que luego se traduzcan a bytes, o a acciones realizadas sobre dichos bytes.

El meta-lenguaje para expresar la meta-teoría de
(las cadenas de) signos de \(L_{arp}\) es, digamos, el español.

Pero el símil informático sería el lenguaje C,
que usaríamos como meta-lenguaje (o el análogo de...)
para (las sucesiones de) bytes.

Cuando escribo la palabra «vaca», sin las comillas, es una sucesión de signos,
que a su vez significa la imagen que me hice de una rechoncha vaca,
y si ahora escribo eso mismo, pero entre comillas, digamos así: «"vaca"»,
resulta que estoy usando una especie de palabra o frase del español escrito
cuyo significado es la «vaca» (sin comillas del tipo "").

En el lenguaje C ocurrirá algo análogo.
Si tengo la información de la fotografía de una vaca,
eso será un array de muchos bytes consecutivos.
Eso no lo puedo expresar directamente en C
(creo que en el nuevo estándar sí se puede incrustar información binaria),
pero sí que puedo escribir «"vaca"»,
y eso, que aparece así en la sintaxis del lenguaje C,
se traduce (vía el compilador) a una correspondiente secuencia de bytes,
con los caracteres de las letras usadas en ASCII para escribir la palabra «vaca».

______________________


De paso, acá he encontrado, por la necesidad de explicar el tema,
una manera de proceder en el uso de las comillas,
de un modo que no sea ambiguo.

He usado comillas angulares: « ».

Con esas comillas angulares expreso una sucesión de signos,
ya sea de \(L_{arp}\) como de signos-en-general en español,
mientras que con las comillas dobles
me refiero al objeto que es una cadena de signos que me interesa estudiar.

Tengo así, la idea del número natural dos.
Luego tengo una sucesión de fichas o bytes, puestas así:
\(\fbox{01010011} \fbox{01010011} \fbox{00110000}\).
Digo que a esa sucesión de fichas le asigno el significado del natural dos.
La manera que tengo de nombrar esa sucesión de fichas en español, sería ésta:
«\(\fbox{01010011} \fbox{01010011} \fbox{00110000}\)»,
en donde he usado comillas angulares como elementos gramaticales.

Luego digo que en español tenga esta otra palabra:
« " \(\fbox{01010011} \fbox{01010011} \fbox{00110000}\) " »,
es decir, a la sucesión de fichas le he agregado signos de comillas dobles.
Finalmente, establezco que el significado de esa expresión
será lo mismo que «\(\fbox{01010011} \fbox{01010011} \fbox{00110000}\)».

Nota: no sé exactamente el uso que tienen (si es que lo tienen) las comillas angulares en el español de la RAE, pero espero que se haya entendido el uso que les dí acá.



18 Junio, 2023, 06:03 pm
Respuesta #72

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,796
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
Citar
Pero eso es como usar una calculadora para clavar un clavo en una pared. Puedes usarla (si es lo suficientemente resistente y no te importa que deje de funcionar), pero no está pensada para eso. Cualquier lenguaje de programación está preparado para entender como signos los caracteres que sabe manejar. Si tienes un lenguaje que entiende el código ASCII, ¿por qué no usas como signos caracteres del código ASCII y aprovechas las capacidades del lenguaje de programación que tienes? Lo que haces sólo tendría sentido si estuvieras programando una CPU usando lenguaje máquina, y te vieras obligado a hacer referencias directas a las posiciones de memoria en la RAM o en el disco duro.

Pero es que las computadoras no entienden caracteres.
Sólo manejan bytes, y el concepto de caracter es una convención externa humana.
Cuando veo una "X" en el teclado, soy yo el que ve el dibujo de una "X", pero el teclado ve un código binario asociado a esa tecla.

No es posible representar caracteres en una computadora.
Eso sólo existe como convención social.

A continuación parte de tu código en Python:

Citar
Código: [Seleccionar]
nombre = {"00110000" : "0", "01010011" : "S", "01110000" : "p",
          "01100011": "c", "01101011" : "\u03ba", "01110010" : "\u03c1",
          "01111000" : "x", "00111101" : "="}

Si ese código lo has escrito en respuesta a tu interpretación de lo que dije,
entonces creo que no has interpretado lo que quise decir,
o no me supe explicar,
o una combinación convexa de ambas cosas.

Según lo que yo elegí como signos, me sería imposible expresarlos en Python.
De hecho, lo que vos denotaste como "0",
es lo que se traducirá luego en binario a \(\fbox{00110000}\).
No puedo expresar en forma explícita ese octeto en Python
(en realidad sí podría, pero sería un equivalente a poner comillas).

Por lo tanto, yo tendría que escribir tu cógio así, para expresar lo que realmente quería expresar:

Código: [Seleccionar]
nombre = {"0" : "0", "S" : "S", "p" : "p",
          "c": "c", "k" : "\u03ba", "r" : "\u03c1",
          "x" : "x", "=" : "="}

Usando Unicode de 16 bits,
la cadena "k" se traducirá a \(\fbox{01101011}\fbox{00000000}\),
mientras que "\u03c1" se traducirá a \(\fbox{11000001}\fbox{00000003}\).

Yo no estoy usando los bits 0 y 1 como un nuevo alfabeto.
Estoy tomando como signos a los bloques enteros de ocho bits,
que me daría un alfabeto de 256 elementos.
Sería lo mismo que si hubiera tomado fichas con 256 dibujos de animalitos en ellos.

Otra manera equivalente en Python sería esta:

Código: [Seleccionar]
nombre =  {0b00110000 : "0", 0b01010011 : "S",  0b01110000 : "p",
           0b01100011: "c", 0b01101011 : "\u03ba", 0b01110010 : "\u03c1",
          0b01111000 : "x", 0b00111101 : "="}

Eso sí sería eficiente (tanto el índice del diccionario como el valor nombre[j] ocuparían el mismo espacio en memoria, equivalente a, por ejemplo, 1 caracter).



18 Junio, 2023, 06:16 pm
Respuesta #73

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,796
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
Citar
Insisto en que lo más sencillo si te vas a poner a filosofar así, es que modifiques el primer mensaje en el que hablo de ARP y consideres que los signos de ARP son, por definición,

"a", "b", "c", "d", "e", "f", "g", "h"

y así desaparecen todos tus problemas. Lo que ocurre es que en realidad esa restricción es arbitraria e innecesaria, mientras tomes como signos cualquier otro juego alternativo de signos que sean fácilmente manejables, como ocho caracteres cualesquiera de los que un ordenador sabe manejar.

Y a lo mejor tu intento de ser claro me ha dado pie a enredar las cosas.

Puede que tengas razón, y hubiera entendido todo de manera más simple.  :-[

(O puede que me hubiera creído que entendía algo sin entenderlo del todo).

De paso, en mi respuesta a feriva agregué unas nuevas comillas,
porque si quiero hablar de las palabras mismas en español que uso para expresar palabras de otro lenguaje, es un enredo de comillas.

Tengo una bufanda de color rojo.
Ese color lo expreso con la palabra "rojo".
Cuando pongo algo entre comillas, como en el caso de «rojo»,
también significa el color rojo.
Pero ahora, con « "rojo" » me refiero a una sucesión de 6 símbolos (una comilla, seguida de erre, seguida de o, seguida de jota, seguida de o, seguida de comilla),
con lo cual represento una palabra de cuatro letras, que a su vez significa rojo.


18 Junio, 2023, 06:57 pm
Respuesta #74

Carlos Ivorra

  • Administrador
  • Mensajes: 11,883
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
    • Página web personal
Citar
Pero eso es como usar una calculadora para clavar un clavo en una pared. Puedes usarla (si es lo suficientemente resistente y no te importa que deje de funcionar), pero no está pensada para eso. Cualquier lenguaje de programación está preparado para entender como signos los caracteres que sabe manejar. Si tienes un lenguaje que entiende el código ASCII, ¿por qué no usas como signos caracteres del código ASCII y aprovechas las capacidades del lenguaje de programación que tienes? Lo que haces sólo tendría sentido si estuvieras programando una CPU usando lenguaje máquina, y te vieras obligado a hacer referencias directas a las posiciones de memoria en la RAM o en el disco duro.

Pero es que las computadoras no entienden caracteres.
Sólo manejan bytes, y el concepto de caracter es una convención externa humana.
Cuando veo una "X" en el teclado, soy yo el que ve el dibujo de una "X", pero el teclado ve un código binario asociado a esa tecla.

Eso es salirte por la tangente filosóficamente. Yo te estoy diciendo algo muy concreto: si quieres programar un ordenador (como yo he hecho) para que le des una cadena de caracteres y te diga si es o no una cadena de signos de \( \mathcal L_{\rm arp} \) y, en caso afirmativo, que te diga su nombre y su longitud, tienes la opción de tomar como signos de  \( \mathcal L_{\rm arp} \) los caracteres

\( "a",  "b",  "c",  "d",  "e",  "f",  "g",  "h" \)

y que me digas que los caracteres no existen podría ser una respuesta de un chat GPT desorientado, pero no es una respuesta válida, porque yo me estoy refiriendo a algo muy concreto que puedes hacer si quieres, y que no es más que coger mi programa y cambiar el diccionario inicial, de modo que, donde pone "0011000" pones en su lugar el carácter "a", y eso puedes hacerlo, tanto si los caracteres existen como si no existen, y lo que te digo es que si pones el carácter "a" (exista o no) en el diccionario, de modo que, cuando tienes que introducir una cadena en el input, puedes escribir "a" cuando ahora toca escribir "0011000", todo resulta mucho más sencillo.

Puedes hacerlo si quieres o no hacerlo si no quieres, pero no tiene sentido que digas que no lo puedes hacer porque los caracteres no existen.

No es posible representar caracteres en una computadora.
Eso sólo existe como convención social.

Eso es filosofía. La realidad es que yo puedo modificar mi programa cambiando "0011000" por "a", etc., y así me encuentro con que los signos de \( \mathcal L_{\rm arp} \) pasan a ser las ocho primeras letras del alfabeto, y es mucho más fácil introducir cadenas de signos (o presuntas cadenas de signos) para que el ordenador las analice.

A continuación parte de tu código en Python:

Citar
Código: [Seleccionar]
nombre = {"00110000" : "0", "01010011" : "S", "01110000" : "p",
          "01100011": "c", "01101011" : "\u03ba", "01110010" : "\u03c1",
          "01111000" : "x", "00111101" : "="}

Si ese código lo has escrito en respuesta a tu interpretación de lo que dije,
entonces creo que no has interpretado lo que quise decir,
o no me supe explicar,
o una combinación convexa de ambas cosas.

Según lo que yo elegí como signos, me sería imposible expresarlos en Python.

En efecto, he ahí una muestra de lo inadecuado de tu elección. Quieres usar un ordenador para operar con \( \mathcal L_{\rm arp} \) y eliges unos signos que el ordenador no puede entender. No vamos bien. Ya era consciente de que me estaba apartando de tu ejemplo, y por eso lo advertí explícitamente:

Voy a tomar como signos de \( \mathcal L_{\rm arp} \) los que tú has elegido (aunque eso supone una complicación innecesaria en la antítesis de la eficiencia, pues sería mucho más práctico tomar como signos ocho caracteres imprimibles cualesquiera). Eso sí, yo estoy entendiendo que "\(\fbox{01010011}\)" es literalmente un signo de \( \mathcal L_{\rm arp} \) y no el nombre de un signo, que es lo que en el fondo estabas considerando tú. (En realidad omitiré el recuadro, porque eso no se puede introducir con el teclado.)

De hecho, lo que vos denotaste como "0",
es lo que se traducirá luego en binario a \(\fbox{00110000}\).

Por eso te dije que había tomado como signos los nombres que habías dado a tus signos, ya que tus signos son totalmente inapropiados para que los maneje un ordenador. Y sí, sé lo que estoy diciendo: soy consciente de que tú pretendes que tus signos se adecúen lo más exactamente posible a lo que hace un ordenador y yo te estoy diciendo que tus signos son totalmente inadecuados para trabajar con un ordenador, porque un ordenador (si lo diriges mediante un lenguaje de programación de alto nivel) no puede acceder fácilmente a la forma en que almacena la información.

No puedo expresar en forma explícita ese octeto en Python
(en realidad sí podría, pero sería un equivalente a poner comillas).

Por lo tanto, yo tendría que escribir tu cógio así, para expresar lo que realmente quería expresar:

Código: [Seleccionar]
nombre = {"0" : "0", "S" : "S", "p" : "p",
          "c": "c", "k" : "\u03ba", "r" : "\u03c1",
          "x" : "x", "=" : "="}

Usando Unicode de 16 bits,
la cadena "k" se traducirá a \(\fbox{01101011}\fbox{00000000}\),
mientras que "\u03c1" se traducirá a \(\fbox{11000001}\fbox{00000003}\).

Yo no estoy usando los bits 0 y 1 como un nuevo alfabeto.
Estoy tomando como signos a los bloques enteros de ocho bits,
que me daría un alfabeto de 256 elementos.
Sería lo mismo que si hubiera tomado fichas con 256 dibujos de animalitos en ellos.

Y por eso te digo que tu elección es muy inconveniente, porque es prácticamente imposible, o muy complicado, que un ordenador maneje como datos la forma en que representa sus datos a bajo nivel. Si vas a trabajar tú mismo con \( \mathcal L_{\rm arp} \), puedes usar como signos lo que quieras, pero si quieres que un ordenador te ayude, conviene que uses como signos algo que el ordenador entienda, y un ordenador no entiende de bloques de bits igual que yo puedo pensar, y pienso con mis neuronas, pero no entiendo nada de neurología. Un ordenador entiende de caracteres, números enteros, de clicks de ratón, etc.

Otra manera equivalente en Python sería esta:

Código: [Seleccionar]
nombre =  {0b00110000 : "0", 0b01010011 : "S",  0b01110000 : "p",
           0b01100011: "c", 0b01101011 : "\u03ba", 0b01110010 : "\u03c1",
          0b01111000 : "x", 0b00111101 : "="}

Eso sí sería eficiente (tanto el índice del diccionario como el valor nombre[j] ocuparían el mismo espacio en memoria, equivalente a, por ejemplo, 1 caracter).

Pues con esa modificación el programa da error:

Citar
TypeError: startswith first arg must be str or a tuple of str, not int

Así a ojo, supongo que el problema es que Python interpreta las entradas del diccionario como números enteros y necesita que sean cadenas de caracteres.

Pero la cuestión central no es nada de todo esto. Tú has dicho:

Citar
Lo que me chirría o preocupa en todo esto son aquellas ocasiones
en que Carlos afirma que todo esto se puede llevar a cabo en un ordenador.

En rigor, no es cierto

Probablemente, yo habré dicho por ahí que es posible programar un ordenador para que reconozca si una entrada corresponde o no a una cadena de signos y, en tal caso, puede nombrarla y más adelante veremos que también puede identificar si la cadena corresponde a un numeral, a un funtor, a un término, etc. Y tú dices que eso no es cierto. Ya te he mostrado un programa que identifica si una entrada dada es o no una cadena de signos y calcula su nombre y su longitud. Puedo presentarte programas análogos que hagan todo lo que digo que pueden hacer. ¿Puedes decirme un ejemplo concreto de algo que yo haya dicho que puede hacer un ordenador y que no sea cierto que pueda hacerlo, y además fácilmente?

Obviamente, no te lo pregunto porque me ofenda que pongas en duda mi capacidad de programar (que, por cierto, es bastante rudimentaria), sino porque si dices que algo que digo que se puede programar no se puede programar, es porque no estás entendiendo algo importante. Sobre todo, si te muestro el programa y sigues dudando de que se pueda programar.

Tú estás tratando de que el ordenador use de algún modo los convenios de notación que usamos para hablar en español de ARP, pero es absurdo pretender que un ordenador se adapte a normas gramaticales del español. Cuando digo que un ordenador puede hacer algo quiero decir que le das unos datos y el ordenador te devuelve lo que te tiene que devolver. Incluso puedes pedirle que lo exprese en un perfecto español enlatado con tildes, puntos, comas y comillas, pero lo que haga el ordenador entre que recibe los datos y da la respuesta, y el lenguaje de programación en el que esté expresado el programa, es irrelevante.

18 Junio, 2023, 07:16 pm
Respuesta #75

feriva

  • $$\Large \color{#a53f54}\pi\,\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 11,988
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino
Lamentablemente tengo que volver al asunto de las comillas.

La cuestión es que si uno intenta hacer un programa de computadora,
ya no hay signos, sino caracteres, y las comillas se usan con otro significado,
que puede llegar a ser justo el opuesto del uso gramatical dado en este hilo.


No te he leído despacio (después lo hago) pero viendo por dónde va la cosa quizá sirva, para diferenciar esta cuestión al programar, el hecho de que una variable alfanumérica tipo “a” no se puede convertir a int, es decir, int (“a”) da error, mientras que si es alfanumérica del tipo “5”, entonces int(“5”) no da error; sería similar a convertir un nombre en singo quitándole las comillas
(sólo es una idea preliminar, no sé si te servirá para algo).
Saludos.

Pues acá nada da error, no va por ahí la cosa.

Lo que digo es que cuando Carlos habla del significado de una cadena de signos,
y también habla de  cadenas de signos,
está usando el español como metalenguaje...

Es que había mirado muy por encima; ya he leído tu anterior entrada y la contestación de Carlos; ahora me falta terminar ésta, que no da uno abasto :)

Ya he visto que lo enfocas desde el punto de vista de un lenguaje de bajo nivel, como el ensamblador o el código máquina. Yo pensaba en buscar una comparación con cosas que se pueden hacer utiliazando lenguajes de alto nivel (en concreto en Python, porque del Basic ya no me acuerdo y de los fundamentos de C que me enseñaste en aquel curso tampoco).
Vi un parecido en eso que decía, aunque el ordenador en realidad no entienda las cosas y sólo haga operaciones con números.
Pero ahí está el paralelismo, si escribimos un código en un lenguaje de alto nivel, el ordenador distingue entre números y letras; podemos decir que “entiende” (comillas de símil, no confundir) los números porque puede hacer operaciones con ellos, sumar, multiplicar… pero no puede hacer eso con las letras; las puede utilizar como variables, no directamente. Cuando se intenta convertir a int una variable alfanumérica “a”, el ordenador da error porque “no entiende” lo que le pedimos, “a” no significa nada como nombre para él, es un signo y nosotros podemos asumir (aunque no sea así, podemos asumir el parecido) que no comprende la operación de convertirlo a signo porque ya lo es. Si embargo, mediante una sentencia condicional, le podemos decir, por ejemplo, que cuando decimos el nombre “a”, entonces 1, que cuando “b” entonces 2… lo que sea.
Así, “a” es un signo, no un nombre, porque no lo entiende; tampoco lo puede usar directamente como signo, pero sí se puede usar un sinónimo, eso no es problema.
Al escribir en código “5” y pedirle que halle la raíz cuadrado de eso, tampoco lo entiende, no puede operar con un nombre. Sin embargo, en este otro caso sí entiende la operación int(“5”) que es quitarle las comillas, eso es lo que hace el ordenador (en el lenguaje de alto nivel) quedando 5, un signo, y ya sí puede operar, porque ha dejado se ser un nombre. Es bastante análogo a cómo usamos nosotros el lenguaje, nosotros podemos decir “el número ‘nueve’”*, pero no sumamos con eso al escribir en un papel, escribimos 9, escribimos números, no nombres del español.
*(Para que quede claro, ahí en el asterisco pongo comillas de diálogo, como en las narraciones cuando habla un personaje: y Pepe dijo, “¡caramba, qué bien!”. Y, por otro lado, las comillas con el significado que nos ocupa al decir la palabra ‘nueve’, como nombre de número).

Yo puedo hacer así fácilmente un programa que distinga signos de nombres usando el comando int y el comando que maneja los errores para que la maquina no se bloquee, lo que antiguamente era en “on error goto” en Basic o lo que ahora es el Try except del Python.

Saludos.

18 Junio, 2023, 10:03 pm
Respuesta #76

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,796
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
Citar
TypeError: startswith first arg must be str or a tuple of str, not int

Bueno, me disculpo por esto.
Sólo verifiqué que fuera válido poner literales binarios en Python,
y no me fijé si eso era válido como entrada de un diccionario.

Los enteros serían válidos como índices de un array.

Citar
Por eso te dije que había tomado como signos los nombres que habías dado a tus signos, ya que tus signos son totalmente inapropiados para que los maneje un ordenador.

Pero es que es que eso es lo único que maneja un ordenador: los octetos de bits.
Cualquier otra cosa es inapropiada para ser manejada por una computadora.

Para mí eso no es algo filosófico, sino que es la realidad.

Si me topo de casualidad con unas rajaduras en el suelo con forma de H,
eso no quiere decir que eso sea el signo "H".
Es una hache cuando así la interpreto en mi mente.

Pero bueno, no sé si tiene caso seguir discutiendo esto,
porque creo que sólo consigo hacerte poner de mal humor.
Creo que fue mala idea de mi parte volver sobre lo mismo.

Quizás lo más importante esté resuelto,
que es el uso que le das a las comillas.

Citar
y lo que te digo es que si pones el carácter "a" (exista o no) en el diccionario, de modo que, cuando tienes que introducir una cadena en el input, puedes escribir "a" cuando ahora toca escribir "0011000", todo resulta mucho más sencillo.

Y sí, claro que es más sencillo.
Pero es que nunca quise hacer otra cosa.
Yo en Python nunca escribiría "01100001", sino que escribiría "a", sabiendo que eso
se ejecutará en tiempo de ejecución de modo que produzca
en memoria un byte (asumiendo ASCII): \(\fbox{01100001}\)
[Con Unicode se introducirían tecnicismos que no vienen al caso].

Luego se muestra en pantalla esta imagen gráfica:

a

Pero Python nunca leyó ni escribió eso.
Ni el compilador de Python tampoco.

Al usar la función "input" en tu programa,
el compilador Python se comunica de algún modo con el sistema operativo,
y el usuario presiona un botón en su teclado que tiene pintado un dibujito con la siguiente forma:



Nunca hubo un caracter en este proceso, ni un glifo.
Si tuviera pintada una vaca en el botón en cuestión, el resultado sería el mismo.

Eso se terminará interpretando como el bloque de bits \(\fbox{01100001}\).
Python captura esa secuencia de 1 byte,
como si fuese la sucesión de 1 caracter,
pero no hay caracter alguno, sino sólo un número.

Eso mismo se almacena internamente en memoria.
Luego, el comipilador Python, con el comando "print",
envía exactamente lo mismo como respuesta:
\(\fbox{01100001}\)

Ni siquiera hace falta saber cuál es el código binario de la letra "a",
ni las vueltas que pueda tener el compilador Python en su manera última
de representar una cadena (que poría llegar a  ser más complicada que un mero array).
Pero tanto en la lectura como en la escritura, recibe y envía lo mismo.

Eso ocurre, no por que use Unicode, que lo usa,
sino que al elegir una codificación, asegura que hay uniformidad
entre el código fuente, los datos de entrada, y los datos de respuesta.

Lo que yo veo en pantalla es un dibujito de la letra "a",
que es algo que me lo produce el sistema operativo (Windows),
cuando decide asociar lo que Python envió como respuesta
con una fuente de texto.

Si el sistema operativo eligiera una fuente de texto que elige dibujar animalitos,
y me dibuja una vaquita en vez de una "a",
pues eso no lo puedo controlar yo como programador de Python.

[Y si tengo que ser sincero, no creo que los caracteres correctos se vean bien gracias a Windows, sino que el IDLE Shell de Python se asegura que todo funciona como se espera,
pero de todos modos, el IDLE es una herramienta externa al lenguaje Python.]

Citar
Y sí, sé lo que estoy diciendo: soy consciente de que tú pretendes que tus signos se adecúen lo más exactamente posible a lo que hace un ordenador y yo te estoy diciendo que tus signos son totalmente inadecuados para trabajar con un ordenador, porque un ordenador (si lo diriges mediante un lenguaje de programación de alto nivel) no puede acceder fácilmente a la forma en que almacena la información.

Pero es que no importa si es un lenguaje de alto nivel o bajo nivel.
No hay ninguna diferencia.

En el lenguaje de alto nivel pasa lo mismo.

Al escribir "0" en Python, eso es lo mismo que escribir
\(\fbox{00100010}\fbox{00110000}\fbox{00100010}\)
(comillas, decimal-cero, comillas).
El contenido del código fuente en Python es una sucesión de tres octetos con esa forma.

Eso se traduce, cuando el programa es ejecutado,
a exactamente lo mismo, pero sin las comillas:
\(\fbox{00110000}\).

Y tampoco es que haga falta conocer cómo trabaja la máquina en lenguaje de máquina.

Sino que, en realidad, ese es el significado de la cadena "0" que uno escribe en el código fuente: un array que contiene lo que corresponde al caracter del símbolo decimal-cero.
El significado de un código fuente es el resultado esperado en la ejecución del programa.
Eso está bien especificado en un lenguaje, porque si no, sólo serían reglas de sintaxis.

E incluive, en lenguajes como C, está especificado cómo se representan internamente ciertos datos, como los números enteros, y los caracteres bajo codificaciones como las de Unicode.
Pero al fin y al cabo no hay caracteres, ni nada,
sólo números que se pasean de acá para allá.

Si uno no quisiera pensar en bits, sino en los caracteres que representan,
también podría usar cajitas,
y decir que \(\fbox{"}\fbox{S}\fbox{"}\) es la sintaxis en Python
para representar la cadena de caracteres \(\fbox{S}\).

Y esa última cajita  no es de bajo nivel ni de alto nivel.
Es la representación de un caracter.

______________

Citar
Quieres usar un ordenador para operar con \( \mathcal L_{arp}\) y eliges unos signos que el ordenador no puede entender. No vamos bien. Ya era consciente de que me estaba apartando de tu ejemplo, y por eso lo advertí explícitamente:

Pero no es que una computadora no puedo entender "mis" signos.
Sí que puede, y son los únicos que entiende.
Quien no puede entenderlos directamente, digamos,
es el lenguaje Python, o cualquier otro lenguaje de programación,
ya sea de alto o de bajo nivel.

Pero a fin de cuentas, cualquier lenguaje de programación es inocuo
si no se traduce a una semántica ejecutable,
y el comportamiento esperado está especificado para cada lenguaje de programación.

No es que usé \(\fbox{1010011}\) como el nombre del signo,
sino que quiero estampar en el texto el signo per se,
de modo de poder señalarlo directamente, sin acudir a comillas.

___________________

Por otra parte, ciertas cosas dependen del lenguaje,
y no de si es alto o bajo nivel.

Por ejemplo, C++ es un lenguaje de alto nivel,
y sin embargo entiende los caracteres en forma diferente a Python.
En C++, el caracter 'a' ES el número binario 01100001
(asumiendo ASCII).

La siguiente comparación en C++ da resultado true (verdadero)
cuando se compila y ejecuta el programa:

'a' == 97

Es una forma alternativa de expresar el número entero noventa y siete.

En cambio, lo siguiente daría falso o un error:

"a" == 97

De nuevo, en C++, uno puede expresar un código Unicode de dos maneras:


#include <iostream>
using namespace std;

int main()
{
    cout << ((L'κ' == L'\u03ba')? "verdadero" : "falso") << "\n";
    cout << ((L'κ' == L'\x03ba')? "verdadero" : "falso") << "\n";
    cout << ((L'κ' == 0x03ba)? "verdadero" : "falso") << "\n";
}


Pero la primera forma controla el caracter representado, de forma sintáctica,
y la segunda lo hace de forma más bien semántica.

Lo que quiero decir es que \u03ba es interpretado por el compilador C++
de la misma manera que si yo hubiera tipeado en el editor de textos
el caracter \(\kappa\).
El compilador ve el código correspondiente, y lo traduce al entorno de ejecución,
con el valor binario correspondiente (que bajo otra codificación podría cambiar).

Mientras que \x03ba procede diferentemente,
ya que primero el compilador computa el valor entero que le corresponde,
lo pasa como siempre a binario,
y luego muestra en el entorno de ejecución el caracter que le corresponda,
que puede coincidir o no con \(\kappa\), tras cruzar los dedos y tener suerte.

La primera igualdad siempre va a dar verdadera,
pero la segunda puede dar falsa
(por ejemplo, si al ejecutar no se usa Unicode).

La tercer igualdad será verdadera si la codificación es Unicode.
(Esa línea la agregué después).

________________

Citar
Probablemente, yo habré dicho por ahí que es posible programar un ordenador para que reconozca si una entrada corresponde o no a una cadena de signos y, en tal caso, puede nombrarla y más adelante veremos que también puede identificar si la cadena corresponde a un numeral, a un funtor, a un término, etc. Y tú dices que eso no es cierto. Ya te he mostrado un programa que identifica si una entrada dada es o no una cadena de signos y calcula su nombre y su longitud. Puedo presentarte programas análogos que hagan todo lo que digo que pueden hacer. ¿Puedes decirme un ejemplo concreto de algo que yo haya dicho que puede hacer un ordenador y que no sea cierto que pueda hacerlo, y además fácilmente?

No creí que eso fuera objeto de discusión.

Pero bueno, para mí un signo sólo tiene sentido en el contexto del lenguaje hablado o escrito.

Por eso digo que no es cierto que tu programa Python hace lo que afirmás que hace.

Yo veo en tu programa que aparece esto:

"S"

Eso es una imagen visual.
Entiendo ahí una sucesión de tres símbolos (¿signos, caracteres?, pues puedo entender ambas cosas, total se trata de lo que veo).
Mas, yo veo eso en un editor de texto.

Pero Python no ve eso.
Python ve mis cajitas:

\(\fbox{0100010} \fbox{01010011} \fbox{0100010}\)

Concretamente, Python no ve nada, porque Python mismo no existe, salvo como definición en alguna página web.

Quien ve eso es el compilador de Python,
que es un programa que traduce la sintaxis de Python
a la semántica ejecutable pretendida de Python.
Dicho compilador se encarga de eliminar las comillas, y almacena esto:

\( \fbox{01010011} \)

Y cuando se le da la orden "print", envía eso mismo como resultado.

Quien transforma eso en dibujito que luce así:

a

es un agente externo a Python.

Y por eso digo que Python no maneja caracteres en ningún momento,
si ni siquiera maneja la fuente conque se elige presentar el glifo correspondiente en pantalla.

En lo referido a texto, Python maneja arrays de números enteros.
Internamente, supuestamente, entiende Unicode.

Pero la verdad es que eso seguiría siendo verdad
(suponiendo un compilador muy rudimentario de Python)
sin necesidad de que el compilador haga nada especial.
Quienes manejan Unicode son el editor de texto, y el programita que imprime en la pantalla.

[Siendo más preciso, estoy seguro que el compilador real de Python sí que implementa cosas concretas sobre Unicode, y además el IDLE usa una fuente que muestra glifos correctos.]


18 Junio, 2023, 10:27 pm
Respuesta #77

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,796
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
Para visualizarlo mejor,
podría encadenar varias computadoras que se mandan mensajes entre sí usando Python.

Un usuario emisor E presiona la tecla ⓐ.
Pretende que le llegue como mensaje la letra "a" a un usuario receptor R en el otro lado del mundo.
Lo hace con un programa en Python, que lee su entrada de teclado,
con una computadora \(C_1\),
y envía el mensaje por Internet a una página web,
la cual tiene un servidor \(C_2\)
que está programado en Python, captura el mensaje, y lo reenvía a otro servidor,
y así sucesivamente, hasta que llega al receptor.

\(\fbox{E} \Longrightarrow \fbox{C_1} \Longrightarrow \fbox{C_2} \Longrightarrow \cdots \Longrightarrow \fbox{C_n}\Longrightarrow \fbox{ R}\).

Lo que cada uno ve es esto:

ⓐ \( \Longrightarrow \fbox{1100001} \Longrightarrow \fbox{1100001} \Longrightarrow \cdots \Longrightarrow \fbox{1100001}\Longrightarrow \fbox{    a   }\).

Nunca se envió un caracter entre las computadoras.
Que la intención de E coincida con lo que entendió R
es producto de una sólida convención social (un estándar tecnológico).

En el único momento que se podría decir que hubo algo parecido a un caracter
es en el momento que apareció la "a" en la pantalla del receptor R.
Ni siquiera cuando el emisor E presionó una tecla es que hubo un caracter involucrado ahí.



18 Junio, 2023, 11:10 pm
Respuesta #78

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,796
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
Lamentablemente tengo que volver al asunto de las comillas.

La cuestión es que si uno intenta hacer un programa de computadora,
ya no hay signos, sino caracteres, y las comillas se usan con otro significado,
que puede llegar a ser justo el opuesto del uso gramatical dado en este hilo.


No te he leído despacio (después lo hago) pero viendo por dónde va la cosa quizá sirva, para diferenciar esta cuestión al programar, el hecho de que una variable alfanumérica tipo “a” no se puede convertir a int, es decir, int (“a”) da error, mientras que si es alfanumérica del tipo “5”, entonces int(“5”) no da error; sería similar a convertir un nombre en singo quitándole las comillas
(sólo es una idea preliminar, no sé si te servirá para algo).
Saludos.

Pues acá nada da error, no va por ahí la cosa.

Lo que digo es que cuando Carlos habla del significado de una cadena de signos,
y también habla de  cadenas de signos,
está usando el español como metalenguaje...

Es que había mirado muy por encima; ya he leído tu anterior entrada y la contestación de Carlos; ahora me falta terminar ésta, que no da uno abasto :)

Ya he visto que lo enfocas desde el punto de vista de un lenguaje de bajo nivel, como el ensamblador o el código máquina. Yo pensaba en buscar una comparación con cosas que se pueden hacer utiliazando lenguajes de alto nivel (en concreto en Python, porque del Basic ya no me acuerdo y de los fundamentos de C que me enseñaste en aquel curso tampoco).
Vi un parecido en eso que decía, aunque el ordenador en realidad no entienda las cosas y sólo haga operaciones con números.
Pero ahí está el paralelismo, si escribimos un código en un lenguaje de alto nivel, el ordenador distingue entre números y letras; podemos decir que “entiende” (comillas de símil, no confundir) los números porque puede hacer operaciones con ellos, sumar, multiplicar… pero no puede hacer eso con las letras; las puede utilizar como variables, no directamente. Cuando se intenta convertir a int una variable alfanumérica “a”, el ordenador da error porque “no entiende” lo que le pedimos, “a” no significa nada como nombre para él, es un signo y nosotros podemos asumir (aunque no sea así, podemos asumir el parecido) que no comprende la operación de convertirlo a signo porque ya lo es. Si embargo, mediante una sentencia condicional, le podemos decir, por ejemplo, que cuando decimos el nombre “a”, entonces 1, que cuando “b” entonces 2… lo que sea.
Así, “a” es un signo, no un nombre, porque no lo entiende; tampoco lo puede usar directamente como signo, pero sí se puede usar un sinónimo, eso no es problema.
Al escribir en código “5” y pedirle que halle la raíz cuadrado de eso, tampoco lo entiende, no puede operar con un nombre. Sin embargo, en este otro caso sí entiende la operación int(“5”) que es quitarle las comillas, eso es lo que hace el ordenador (en el lenguaje de alto nivel) quedando 5, un signo, y ya sí puede operar, porque ha dejado se ser un nombre. Es bastante análogo a cómo usamos nosotros el lenguaje, nosotros podemos decir “el número ‘nueve’”*, pero no sumamos con eso al escribir en un papel, escribimos 9, escribimos números, no nombres del español.
*(Para que quede claro, ahí en el asterisco pongo comillas de diálogo, como en las narraciones cuando habla un personaje: y Pepe dijo, “¡caramba, qué bien!”. Y, por otro lado, las comillas con el significado que nos ocupa al decir la palabra ‘nueve’, como nombre de número).

Yo puedo hacer así fácilmente un programa que distinga signos de nombres usando el comando int y el comando que maneja los errores para que la maquina no se bloquee, lo que antiguamente era en “on error goto” en Basic o lo que ahora es el Try except del Python.

Saludos.

No sé por qué me insisten con lo del bajo nivel y el alto nivel.

Python opera en binario, aún a "alto nivel".

El compilador de Python nunca traduce de número a caracter y viceversa.
Es algo innecesario.
La información pasa de manera transparente.

A lo mejor hace algunas verificaciones por cuestiones de consistencia y seguridad,
pero si quisiera, podría tan sólo quitar las comillas y pasar eso a la pantalla para que se imprima.
Y eso, que está en binario, no se imprime en binario en la pantalla.
Pero eso no es cosa de Python.

No sé.
Será que al final ya veo todo en binario.

____________

Lo que digo es que no tiene sentido hablar de signos entre computadoras.
Por eso busco algo similar, para que tenga sentido decir lo mismo en el contexto informático.



18 Junio, 2023, 11:17 pm
Respuesta #79

Carlos Ivorra

  • Administrador
  • Mensajes: 11,883
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
    • Página web personal
Citar
TypeError: startswith first arg must be str or a tuple of str, not int

Bueno, me disculpo por esto.
Sólo verifiqué que fuera válido poner literales binarios en Python,
y no me fijé si eso era válido como entrada de un diccionario.

Los enteros serían válidos como índices de un array.

No, si los enteros son válidos como entradas de un diccionario. Lo que falla es el punto en el que el algoritmo trata de reconocer si la cadena introducida por el usuario empieza por uno de los signos del lenguaje. Una cadena de signos no puede empezar por un entero, tiene que empezar por una cadena de caracteres, y ahí se produce el error.

Citar
Por eso te dije que había tomado como signos los nombres que habías dado a tus signos, ya que tus signos son totalmente inapropiados para que los maneje un ordenador.

Pero es que es que eso es lo único que maneja un ordenador: los octetos de bits.
Cualquier otra cosa es inapropiada para ser manejada por una computadora.

Para mí eso no es algo filosófico, sino que es la realidad.

No. Eso es como decir que, como mis neuronas sólo entienden de corrientes eléctricas, sustancias químicas que las excitan, etc., eso es lo único que puedo manejar yo, y eso no es verdad. Yo no soy mis neuronas. Yo soy la actividad de mis neuronas y no entiendo nada de corrientes eléctricas, sustancias químicas, nervios etc.

Igualmente, cuando hablo de un ordenador, yo estoy hablando de un algoritmo expresable en un lenguaje de programación. Y lo que te digo es que, cuando ejecuto el programa que he puesto antes, mi ordenador entenderá cualquier cosa que le meta por el teclado, sea un 0, un 1 una ñ o cualquier otra letra, pero no entenderá nada de octetos de bits igual que yo no entiendo nada de neuronas y todo mi cerebro está hecho de neuronas. Que la memoria de un ordenador consista en octetos de bits no significa que un ordenador tenga que entender nada sobre octetos de bits. Si un octeto de bit no está en el teclado, ni lo puedo señalar con el ratón para hacer click en él, entonces el ordenador sabe lo mismo de sus octetos de bits que yo de mis neuronas: nada.

Si me topo de casualidad con unas rajaduras en el suelo con forma de H,
eso no quiere decir que eso sea el signo "H".
Es una hache cuando así la interpreto en mi mente.

Pero bueno, no sé si tiene caso seguir discutiendo esto,
porque creo que sólo consigo hacerte poner de mal humor.
Creo que fue mala idea de mi parte volver sobre lo mismo.

No sé de dónde sacas que me pongo de mal humor. Sólo procuro darte los argumentos que me parecen más claros o ilustrativos a cada cosa que dices.

Quizás lo más importante esté resuelto,
que es el uso que le das a las comillas.

¿Y qué otra cosa queda por resolver?

Citar
y lo que te digo es que si pones el carácter "a" (exista o no) en el diccionario, de modo que, cuando tienes que introducir una cadena en el input, puedes escribir "a" cuando ahora toca escribir "0011000", todo resulta mucho más sencillo.

Y sí, claro que es más sencillo.
Pero es que nunca quise hacer otra cosa.
Yo en Python nunca escribiría "01100001", sino que escribiría "a", sabiendo que eso
se ejecutará en tiempo de ejecución de modo que produzca
en memoria un byte (asumiendo ASCII): \(\fbox{01100001}\)
[Con Unicode se introducirían tecnicismos que no vienen al caso].

Luego se muestra en pantalla esta imagen gráfica:

a

Pero Python nunca leyó ni escribió eso.
Ni el compilador de Python tampoco.

Al usar la función "input" en tu programa,
el compilador Python se comunica de algún modo con el sistema operativo,
y el usuario presiona un botón en su teclado que tiene pintado un dibujito con la siguiente forma:



Nunca hubo un caracter en este proceso, ni un glifo.
Si tuviera pintada una vaca en el botón en cuestión, el resultado sería el mismo.

Eso se terminará interpretando como el bloque de bits \(\fbox{01100001}\).
Python captura esa secuencia de 1 byte,
como si fuese la sucesión de 1 caracter,
pero no hay caracter alguno, sino sólo un número.

Eso mismo se almacena internamente en memoria.
Luego, el comipilador Python, con el comando "print",
envía exactamente lo mismo como respuesta:
\(\fbox{01100001}\)

Ni siquiera hace falta saber cuál es el código binario de la letra "a",
ni las vueltas que pueda tener el compilador Python en su manera última
de representar una cadena (que poría llegar a  ser más complicada que un mero array).
Pero tanto en la lectura como en la escritura, recibe y envía lo mismo.

Eso ocurre, no por que use Unicode, que lo usa,
sino que al elegir una codificación, asegura que hay uniformidad
entre el código fuente, los datos de entrada, y los datos de respuesta.

Lo que yo veo en pantalla es un dibujito de la letra "a",
que es algo que me lo produce el sistema operativo (Windows),
cuando decide asociar lo que Python envió como respuesta
con una fuente de texto.

Si el sistema operativo eligiera una fuente de texto que elige dibujar animalitos,
y me dibuja una vaquita en vez de una "a",
pues eso no lo puedo controlar yo como programador de Python.

[Y si tengo que ser sincero, no creo que los caracteres correctos se vean bien gracias a Windows, sino que el IDLE Shell de Python se asegura que todo funciona como se espera,
pero de todos modos, el IDLE es una herramienta externa al lenguaje Python.]

Todo esto es como si yo te digo que voy a hablar con un amigo y tú me dices que no va a entender lo que le voy a decir porque para que me entienda tengo que saber cómo funciona su cerebro, y entonces me das un curso de neurología. Y yo te digo que no necesito saber nada sobre el funcionamiento del cerebro de mi amigo para hablar con él. Porque mi amigo no es su cerebro. Es la actividad de su cerebro. Y si voy a hablar con él de coches, no importa para nada cómo se almacena en su cerebro el concepto de "coche". Me basta saber que cuando le diga "coche", sabrá de qué estoy hablando. Más aún, si le mostrara una descripción fidedigna de cómo se almacena el concepto "coche" en su cerebro (si es que eso se conoce, cosa que dudo) mi amigo no entendería que le estaría hablando de un coche, porque mi amigo sabe lo que son coches, no sabe nada sobre la forma en que su cerebro maneja el concepto de "coche".

Citar
Y sí, sé lo que estoy diciendo: soy consciente de que tú pretendes que tus signos se adecúen lo más exactamente posible a lo que hace un ordenador y yo te estoy diciendo que tus signos son totalmente inadecuados para trabajar con un ordenador, porque un ordenador (si lo diriges mediante un lenguaje de programación de alto nivel) no puede acceder fácilmente a la forma en que almacena la información.

Pero es que no importa si es un lenguaje de alto nivel o bajo nivel.
No hay ninguna diferencia.

En el lenguaje de alto nivel pasa lo mismo.

Aquí algo no encaja. Lo que yo te decía tiene que ver precisamente con los lenguajes de alto nivel. Si estuvieras programando directamente en código máquina, entendería que es relevante tener en cuenta cómo se almacenan los datos en la memoria del ordenador, pero un lenguaje de alto nivel maneja caracteres, enteros, reales, etc. sin "conciencia" de cómo se almacena la información en su memoria.

Al escribir "0" en Python, eso es lo mismo que escribir
\(\fbox{00100010}\fbox{00110000}\fbox{00100010}\)
(comillas, decimal-cero, comillas).
El contenido del código fuente en Python es una sucesión de tres octetos con esa forma.

Eso se traduce, cuando el programa es ejecutado,
a exactamente lo mismo, pero sin las comillas:
\(\fbox{00110000}\).

Y tampoco es que haga falta conocer cómo trabaja la máquina en lenguaje de máquina.

Sino que, en realidad, ese es el significado de la cadena "0" que uno escribe en el código fuente: un array que contiene lo que corresponde al caracter del símbolo decimal-cero.
El significado de un código fuente es el resultado esperado en la ejecución del programa.
Eso está bien especificado en un lenguaje, porque si no, sólo serían reglas de sintaxis.

E incluive, en lenguajes como C, está especificado cómo se representan internamente ciertos datos, como los números enteros, y los caracteres bajo codificaciones como las de Unicode.
Pero al fin y al cabo no hay caracteres, ni nada,
sólo números que se pasean de acá para allá.

Si uno no quisiera pensar en bits, sino en los caracteres que representan,
también podría usar cajitas,
y decir que \(\fbox{"}\fbox{S}\fbox{"}\) es la sintaxis en Python
para representar la cadena de caracteres \(\fbox{S}\).

Y esa última cajita  no es de bajo nivel ni de alto nivel.
Es la representación de un caracter.

Sí, no te discuto nada de todo eso. Sólo te digo que todo eso es como si describes el funcionamiento de un cerebro humano. Eso no ayuda en nada a la hora de dialogar con el humano en cuestión. Si quiero que la persona me entienda, no tendré que hablarle de neuronas, de nervios, de partes del cerebro, etc. Tendré que hablarle de coches, de flores y de estrellas, que son cosas que sí que entenderá. Igualmente, yo puedo "hablar" con un ordenador mediante el teclado y el ratón, o descargándole información de internet (en cuyo caso le estaré "hablando" de archivos, etc.), pero no puedo hablarle de octetos ni de posiciones de memoria, ni de arrays, ni de nada de todo eso, porque el ordenador no lo entenderá, igual que yo no entendería nada de un manual de neurología, aunque éste describa fielmente mi cerebro. Yo no soy mi cerebro y un ordenador no es su memoria. Yo soy lo que pienso y un ordenador es lo que sabe hacer, lo que entiende.

Citar
Quieres usar un ordenador para operar con \( \mathcal L_{arp}\) y eliges unos signos que el ordenador no puede entender. No vamos bien. Ya era consciente de que me estaba apartando de tu ejemplo, y por eso lo advertí explícitamente:

Pero no es que una computadora no puedo entender "mis" signos.
Sí que puede, y son los únicos que entiende.
Quien no puede entenderlos directamente, digamos,
es el lenguaje Python, o cualquier otro lenguaje de programación,
ya sea de alto o de bajo nivel.

Pues ésa es la cuestión. Que, igual que cuando hablo de un amigo no hablo de su cerebro, sino del amigo con el que yo puedo hablar, cuando hablo de un ordenador no hablo de su arquitectura, sino de lo que el ordenador entiende en el lenguaje con el que me comunico con él. Lo que yo llamo "mi amigo" es "Python" (o cualquier otro lenguaje de programación de alto nivel, es decir, muy alejado de lo que hace la máquina en sí) y lo que tú llamas "el ordenador" es lo que yo llamo "el cerebro de mi amigo", que es algo totalmente irrelevante a la hora de hablar con mi amigo.

Pero a fin de cuentas, cualquier lenguaje de programación es inocuo
si no se traduce a una semántica ejecutable,
y el comportamiento esperado está especificado para cada lenguaje de programación.

Efectivamente, y lo único que importa es el lenguaje. Te ponía el ejemplo siguiente:

Imagina que dentro de 1000 años, tras una catástrofe nuclear, hemos vuelto a la Edad Media, pero se conservan algunos libros de la "Antigüedad Clásica" (la actualidad), y los medievales futuros han encontrado manuales de Python y los entienden, y saben cómo escribir programas en Python y saben lo que debería hacer un ordenador que los ejecutara, pero no tienen ningún ordenador ni tienen la menor idea de cómo construir uno, ni cómo podría una máquina ejecutar el código Python. Pero entienden el manual y saben qué efecto tiene que tener cada cosa.

Pues alguien así podría seguir perfectamente todo lo que he dicho yo en el hilo sobre lo que puede o no puede hacer un ordenador. No es necesario saber nada sobre ordenadores para tener claro si un programa en Python cumple un objetivo determinado. Cualquiera que haya estudiado el lenguaje Python, aunque jamás haya visto un ordenador ni sepa cómo funcionan los ordenadores, puede escribir programas en Python (suponiendo que es lo suficientemente brillante como para depurar errores sin ejecutar el código, lo cual es difícil, pero no imposible a priori). Alguien que leyera mi hilo en la Edad Media futura tendría todos los elementos necesarios para entender todo lo que se dice en él, incluso cuando digo que un ordenador puede hacer tal o cual cosa, sin que para ello se requiera el menor conocimiento sobre ordenadores, igual que puedo decir que un amigo mío sabe sumar sin saber nada sobre neurología.

No es que usé \(\fbox{1010011}\) como el nombre del signo,
sino que quiero estampar en el texto el signo per se,
de modo de poder señalarlo directamente, sin acudir a comillas.

Sí, lo entiendo, pero si quieres seguir el convenio sobre el uso de las comillas, tienes que decidir si lo que estampas significa algo en español. Si me dices que no significa nada, entonces según el convenio tienes que ponerle comillas igual que en: "red" es rojo en inglés, y no veo que trauma puede suponer poner unas comillas que exige un convenio gramatical, mientras que si decides que sí que significa algo, entonces es que lo que estampas no es el signo per se, sino que le estás dando el status de una palabra española.

No puedes nadar y guardar la ropa: tienes que decidir si lo que estampas es una palabra española o no. Si es una palabra española, no necesita comillas, pero no es tu signo, sino un nombre para tu signo. Si no es una palabra española, podrías tomarlo como tu signo, pero necesita comillas.

Yo diría que el caso que se ajusta a lo que quieres hacer es el segundo: lo que estampas en el papel no es tu signo, sino un nombre para tu signo, porque tu signo es un array de bits y, como tal, no es imprimible, no es nada que pueda estamparse en ningún sitio.

Por otra parte, ciertas cosas dependen del lenguaje,
y no de si es alto o bajo nivel.

Por ejemplo, C++ es un lenguaje de alto nivel,
y sin embargo entiende los caracteres en forma diferente a Python.
En C++, el caracter 'a' ES el número binario 01100001
(asumiendo ASCII).

La siguiente comparación en C++ da resultado true (verdadero)
cuando se compila y ejecuta el programa:

'a' == 97

Es una forma alternativa de expresar el número entero noventa y siete.

En cambio, lo siguiente daría falso o un error:

"a" == 97

De nuevo, en C++, uno puede expresar un código Unicode de dos maneras:


#include <iostream>
using namespace std;

int main()
{
    cout << ((L'κ' == L'\u03ba')? "verdadero" : "falso") << "\n";
    cout << ((L'κ' == L'\x03ba')? "verdadero" : "falso") << "\n";
    cout << ((L'κ' == 0x03ba)? "verdadero" : "falso") << "\n";
}


Pero la primera forma controla el caracter representado, de forma sintáctica,
y la segunda lo hace de forma más bien semántica.

Lo que quiero decir es que \u03ba es interpretado por el compilador C++
de la misma manera que si yo hubiera tipeado en el editor de textos
el caracter \(\kappa\).
El compilador ve el código correspondiente, y lo traduce al entorno de ejecución,
con el valor binario correspondiente (que bajo otra codificación podría cambiar).

Mientras que \x03ba procede diferentemente,
ya que primero el compilador computa el valor entero que le corresponde,
lo pasa como siempre a binario,
y luego muestra en el entorno de ejecución el caracter que le corresponda,
que puede coincidir o no con \(\kappa\), tras cruzar los dedos y tener suerte.

La primera igualdad siempre va a dar verdadera,
pero la segunda puede dar falsa
(por ejemplo, si al ejecutar no se usa Unicode).

La tercer igualdad será verdadera si la codificación es Unicode.
(Esa línea la agregué después).


Otro curso de neurología robótica. Insisto en que nada de lo que dices en pasajes como éste me parece relevante. Nunca he estudiado los detalles sobre el funcionamiento de un ordenador con el nivel de profundidad que detallas, pero no dices nada que me parezca raro o que contradiga la idea general que tengo al respecto. Pero sólo puedo decirte una cosa: ¿y todo eso qué más da?

Citar
Probablemente, yo habré dicho por ahí que es posible programar un ordenador para que reconozca si una entrada corresponde o no a una cadena de signos y, en tal caso, puede nombrarla y más adelante veremos que también puede identificar si la cadena corresponde a un numeral, a un funtor, a un término, etc. Y tú dices que eso no es cierto. Ya te he mostrado un programa que identifica si una entrada dada es o no una cadena de signos y calcula su nombre y su longitud. Puedo presentarte programas análogos que hagan todo lo que digo que pueden hacer. ¿Puedes decirme un ejemplo concreto de algo que yo haya dicho que puede hacer un ordenador y que no sea cierto que pueda hacerlo, y además fácilmente?

No creí que eso fuera objeto de discusión.

Pero bueno, para mí un signo sólo tiene sentido en el contexto del lenguaje hablado o escrito.

Por eso digo que no es cierto que tu programa Python hace lo que afirmás que hace.

Lo que yo afirmo es que cuando ejecuto el programa, me aparece una frase que me invita a escribir algo en el teclado, yo tecleo algo y me aparece como respuesta si lo que he tecleado es o no una cadena de signos de \( \mathcal L_{\rm arp} \) (en función de qué ocho caracteres —o cadenas de caracteres, aunque sería más sencillo haber tomado ocho caracteres como signos— hemos tomado como signos de \( \mathcal L_{\rm arp} \)) y en caso afirmativo sale también el nombre de esa cadena de signos en términos de los nombres estándar 0, S, p, etc.

Eso es lo que digo que hace mi programa, y no puedes negar que hace eso. Todo lo que pasa "en realidad" desde que aprieto "intro" hasta que sale la respuesta es irrelevante. Lo relevante es que lo que pasa está descrito por el texto que he incluido en un mensaje anterior que expresa el programa en Python.

Cuando yo digo: es posible programar un ordenador para que si le damos una cadena de signos, nos diga si es o no una cadena de signos de \( \mathcal L_{\rm arp} \) y cuál es su nombre. Me refiero ni más ni menos a que existe ese programa que he puesto en un mensaje anterior. Lo que importa son las líneas de texto que he puesto junto con un manual de Python que explique cómo hay que interpretarlas. Que luego un ordenador las interprete o no es irrelevante, y mucho más irrelevante es qué hace el ordenador para conseguir esa respuesta a partir de esa entrada.

Yo veo en tu programa que aparece esto:

"S"

Eso es una imagen visual.
Entiendo ahí una sucesión de tres símbolos (¿signos, caracteres?, pues puedo entender ambas cosas, total se trata de lo que veo).
Mas, yo veo eso en un editor de texto.

Pero Python no ve eso.
Python ve mis cajitas:

\(\fbox{0100010} \fbox{01010011} \fbox{0100010}\)

Concretamente, Python no ve nada, porque Python mismo no existe, salvo como definición en alguna página web.

Quien ve eso es el compilador de Python,
que es un programa que traduce la sintaxis de Python
a la semántica ejecutable pretendida de Python.
Dicho compilador se encarga de eliminar las comillas, y almacena esto:

\( \fbox{01010011} \)

Y cuando se le da la orden "print", envía eso mismo como resultado.

Quien transforma eso en dibujito que luce así:

a

es un agente externo a Python.

Y por eso digo que Python no maneja caracteres en ningún momento,
si ni siquiera maneja la fuente conque se elige presentar el glifo correspondiente en pantalla.

En lo referido a texto, Python maneja arrays de números enteros.
Internamente, supuestamente, entiende Unicode.

Pero la verdad es que eso seguiría siendo verdad
(suponiendo un compilador muy rudimentario de Python)
sin necesidad de que el compilador haga nada especial.
Quienes manejan Unicode son el editor de texto, y el programita que imprime en la pantalla.

[Siendo más preciso, estoy seguro que el compilador real de Python sí que implementa cosas concretas sobre Unicode, y además el IDLE usa una fuente que muestra glifos correctos.]

Eso es como si me dices que si un amigo me ha contado cosas muy interesantes sobre los osos panda en realidad mi amigo no sabe nada de osos panda, porque sólo es un cerebro formado por neuronas y, cuando mi amigo habla de osos panda, en realidad está hablando de ciertas configuraciones neurales, mientras que los osos panda sólo están en sus cuerdas vocales, y en sus gestos, etc.

No. Yo he hablado con mi amigo, no con el cerebro de mi amigo. Igualmente, yo te hablo de mi programa en Python, no de ningún ordenador en particular que lo ejecute. Mi programa seguiría haciendo lo que hace aunque nunca lo hubiera introducido en ningún ordenador y, suponiendo que yo hubiera sido capaz de haber eliminado sus "bugs" sin necesidad de ejecutarlo (cosa imposible en la práctica) no necesitaría para nada ningún ordenador.

Pero de toda esta digresión que —a mi juicio— no aporta nada. Lo único esencial es esto:

Citar
Por eso digo que no es cierto que tu programa Python hace lo que afirmás que hace.

Lo que yo afirmo es que cuando ejecuto el programa, me aparece una frase que me invita a escribir algo en el teclado, yo tecleo algo y me aparece como respuesta si lo que he tecleado es o no una cadena de signos de \( \mathcal L_{\rm arp} \) (en función de qué ocho caracteres —o cadenas de caracteres, aunque sería más sencillo haber tomado ocho caracteres como signos— hemos tomado como signos de \( \mathcal L_{\rm arp} \)) y en caso afirmativo sale también el nombre de esa cadena de signos en términos de los nombres estándar 0, S, p, etc.

Eso es lo que digo que hace mi programa, y no puedes negar que hace eso.

¿O sí que puedes?

Si afirmo que lo hace, es porque miro el código Python que dirige el funcionamiento del ordenador, y tengo la garantía al verlo de que, sea cual sea la entrada que introduzca (mientras no agote la capacidad del ordenador) la salida será la que digo que será. Para concluir eso, sólo necesito mirar el texto del código Python (al menos si tuviera la capacidad cuasidivina de detectar bugs sin necesidad de ejecutar el código). Los ordenadores reales son del todo irrelevantes para lo que yo afirmo.