Saltar al contenido

Concatenar una lista de cadenas en Prolog

El tutorial o código que hallarás en este post es la resolución más eficiente y válida que encontramos a esta inquietud o problema.

Solución:

Dejando de lado por ahora el propósito para el cual es necesario, escribamos un predicado de Prolog que concatene una lista de cadenas en una stringcolocando una nueva línea doble entre cada par de cadenas consecutivas (pero no al final de la salida stringa juzgar por el ejemplo que publicó Jerry).

Manual SWI-Prolog: Normalmente, publicaría enlaces “profundos” a la documentación, pero el sitio SWI-Prolog usa un estilo de URL que activa advertencias de secuencias de comandos entre sitios (XSS) con muchas combinaciones de navegador/complemento. Entonces, en lugar de eso, me referiré al enlace a la sección apropiada.

La Sección 4.22 Representación de texto en cadenas dice (en parte), “Los objetos de cadena por defecto no tienen representación léxica y, por lo tanto, solo se pueden crear usando los predicados a continuación o a través de la interfaz de idioma extranjero”. Esto puede ser un poco confuso, ya que SWI-Prolog escribe cadenas como texto entre comillas dobles, pero lee el texto entre comillas dobles (de manera predeterminada) como listas de códigos de caracteres.

Aquí hay un código para un predicado que concatena las cadenas en una lista, insertando otra string Separador entre consecutivos string pares:

strSepCat([ ],_,Empty) :-
    string_to_list(Empty,[ ]).
strSepCat([H|T],Separator,StrCat) :-
    strSepCat(T,Separator,H,StrCat).

strSepCat([ ],_,StrCat,StrCat).
strSepCat([H|T],Sep,Str,Cat) :-
    string_concat(Sep,H,SepH),
    string_concat(Str,SepH,StrSepH),
    strSepCat(T,Sep,StrSepH,Cat).

Tenga en cuenta que hemos definido dos predicados, strSepCat/3 y strSepCat/4. El primero se define en términos del segundo, un patrón de diseño típico en Prolog que introduce un argumento adicional como un acumulador que se une a una salida cuando se completa la recursividad. Tal técnica suele ser útil para obtener una definición recursiva de cola.

Para usar el predicado strSepCat/3generalmente necesitaríamos construir el separador string con (la secuencia de escape para) dos saltos de línea:

?- funs(Fs,Lisp,[ ]), string_to_list(Sep,"nn"), strSepCat(Fs,Sep,CProg).

¿Qué pasa con el uso de la notación DCG para agregar las cadenas?

concat([]) --> [].
concat([List|Lists]) --> List, "nn", concat(Lists).

Sección de Reseñas y Valoraciones

Si te gusta el asunto, puedes dejar un escrito acerca de qué le añadirías a esta reseña.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *