variable unificacion programacion manejo listas ejemplo clausulas anonima abuelo prolog

programacion - unificacion prolog



Manipulación de cadenas en prólogo (3)

Las cadenas son átomos en Prolog.

En su caso, puede hacer algo como esto: "EFGHIJK" = Lista.

Aquí hay una buena publicación al respecto: http://obvcode.blogspot.com/2008/11/working-with-strings-in-prolog.html

Premisa

Así que estoy tratando de dividir un String dado en una lista de caracteres, estos caracteres serán editados / modificados y reasignados a la lista, después de lo cual la lista se reconstruirá en una cadena.

Un ejemplo:

Given String : "ABCDEFG"

list : [A,B,C,D,E,F,G] caracteres list : [A,B,C,D,E,F,G]

La operación cambia la lista a algo como lo siguiente: [E, F, G, H, I, J, K] (O algo similar).

Y luego se reconstruye en una cadena:

"EFGHIJK"

Pregunta

Estoy buscando una manera de acceder a los elementos individuales dentro de una cadena. Si fuera Java, usaría un comando como charAt(int i) pero no sé si tal comando existe dentro de prolog.

Nota

Soy un nuevo programador de prolog , así que no estoy familiarizado con la mayoría de las operaciones de prolog .

Gracias por tu tiempo.


Puedes intentar esto

t(S_in, S_out) :- maplist(modif, S_in, S_temp), string_to_list(S_out, S_temp). modif(In, Out) :- atom_codes(''A'', [X]), atom_codes(''E'', [Y]), Out is In + Y - X.

Una cadena es una lista de códigos en Prolog. Así que la lista de mapas aplica una modificación en cada uno de los códigos de la lista (una forma funcional). string_to_list es útil para obtener una cadena en la salida en lugar de una lista de códigos.

Puede escribir modif de forma rápida, pero lo escribí de la forma en que puede entenderlo fácilmente.

El resultado es

?- t("ABCDEFG", Out). Out = "EFGHIJK".


Una cadena es una lista de códigos de char, mientras que un átomo es, bueno, atómico , es decir, indivisible, pero hay sub_atom / 5 para acceder a partes de los datos atómicos.

Aquí un ejemplo de cadena:

1 ?- L = "ABCDEF". L = [65, 66, 67, 68, 69, 70]. 2 ?- L = "ABCDEF", maplist(succ, L, N), format(''~s'', [N]). BCDEFG L = [65, 66, 67, 68, 69, 70], N = [66, 67, 68, 69, 70, 71]. 3 ?- L = "ABCDEF", maplist(succ, L, N), format(''~s'', [N]), atom_codes(A, N). BCDEFG L = [65, 66, 67, 68, 69, 70], N = [66, 67, 68, 69, 70, 71], A = ''BCDEFG''.

Si el análisis y la transformación requieren detalles, generalmente es mejor usar los DCG