Cómo encontrar la longitud de la cadena usando prolog

Tengo una longitud de método (lista, var) que me da la longitud de una lista, pero quiero encontrar la longitud de una cadena, ¿alguien tiene una solución?

preguntado el 03 de mayo de 12 a las 13:05

este artículo es confuso (mezcla cadenas y átomos) y aconseja predicados no estándar. Aconsejaría no leerlo. yo aconsejaría esta excelente respuesta para obtener lo que son cadenas de Prolog en su lugar. -

5 Respuestas

Si quisiera ir a ISO Prolog, entonces no usaría el name/2 predicado.

ISO Prolog te ofrece atom_codes/2 y atom_chars/2. Le ofrecen la funcionalidad de convertir un átomo a una lista de códigos oa una lista de caracteres. Los átomos son las cadenas de un sistema Prolog, y los caracteres son simplemente átomos de longitud 1. Aquí hay algunos ejemplos de invocaciones de los dos predicados:

?- atom_codes(ant, L).
L = [97,110,116]
?- atom_codes(X, [97,110,116]).
X = ant
?- atom_chars(ant, X).
X = [a,n,t]
?- atom_chars(X,[a,n,t]).
X = ant

Ahora te preguntas cómo determinar la longitud de una cuerda, también conocida como átomo. Una forma de hacerlo sería determinar primero los códigos o caracteres y luego calcular la longitud de esta lista. Pero ISO también ofrece una atom_length/2 predicado. Funciona de la siguiente manera:

?- atom_length(ant,X).
X = 3

Muchos sistemas Prolog proporcionan este conjunto de predicados incorporados, a saber, SWI Prolog, GNU Prolog, Jekejeke Prolog, etc. El rango de código de caracteres disponible y la codificación dependen del sistema Prolog. Algunos permiten solo códigos de 8 bits, algunos códigos de 16 bits y algunos códigos de 32 bits.

Además, la longitud máxima de un átomo puede diferir y, a veces, hay un tipo de cadena adicional que no se presenta en la tabla en comparación con el tipo de átomo que se muestra a menudo. Pero este tipo adicional generalmente no es lo mismo que una cadena entre comillas dobles, que es solo una forma abreviada de una lista de caracteres.

Respondido 30 Oct 21, 20:10

Dado que las cadenas son átomos, no puede manipularlas directamente para obtener la longitud, extraer subcadenas, etc. Primero debe convertirlas en listas de caracteres con atom_chars/2:

atom_chars(StrVar, ListVar), length(ListVar, LengthVar).

contestado el 03 de mayo de 12 a las 16:05

name/2 no es ISO Prolog y no es la mejor opción aquí. - m09

Gracias, @Mog. Actualizado. Pero como dijo CM, atom_length es la mejor opción en ISO: mark Reed

solo estaba jugando con eso y le di el predicado como

?- length("hello", R).
R = 5.

Sorprendentemente funcionó :)

contestado el 03 de mayo de 12 a las 18:05

Puede verificar su sistema de prólogo y consultar el indicador de prólogo entre comillas dobles. Si dice códigos, las comillas dobles se leen como listas de códigos de caracteres. SWI-Prólogo: ?- indicador_prólogo_actual(comillas_dobles,X). X = códigos. ?- "hola" = [104, 101, 108, 108, 111]. verdadero. - usuario502187

Tal vez esto:

string_length(+String, -Length)

del manual de Prolog.

Respondido el 22 de diciembre de 14 a las 13:12

Esto está disponible para SWI-Prolog, pero no sé si este predicado está integrado para otros sistemas Prolog. - anderson verde

utilizar este :

?- same_length('abhi',Z).
Z=4

si está tratando de crear un archivo .pl para esto, use esto:

samelen(X ,Y) :-  string_length(X,Y).
// ctrl+c & ctrl+b to save this file

//Now write this as query:
samelen(roger,Y).
Y=5 

Respondido el 26 de diciembre de 21 a las 17:12

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.