2011-01-26 31 views

Respuesta

13

En SWI-Prolog, la solución más limpia es escribir un DCG que describa qué es una "línea" y luego llamar a un predicado para cada línea. Use la biblioteca (pio) para aplicar el DCG a un archivo.

EDITAR: Conforme a lo solicitado, tenga en cuenta: el uso

:- use_module(library(pio)). 

lines([])   --> call(eos), !. 
lines([Line|Lines]) --> line(Line), lines(Lines). 

eos([], []). 

line([])  --> ("\n" ; call(eos)), !. 
line([L|Ls]) --> [L], line(Ls). 

muestra: ?- phrase_from_file(lines(Ls), 'your_file.txt').

+0

Sé que ha pasado mucho tiempo, pero estoy intentando este método y parece tomar un tiempo absurdamente largo. ¿Podría proporcionar un ejemplo de algún código de rendimiento utilizando DCG y la biblioteca (pio) que se leerá en un archivo por líneas? ¡Gracias! –

+1

He agregado un ejemplo que espero funcione mejor para usted. – mat

+0

¡Muchas gracias! Veo que mi error anterior era utilizar el ejemplo en la documentación de la biblioteca SWI-Prolog (pio) para mi modelo. Utiliza 'findall/3' para obtener todas las instancias de un cierto patrón, pero veo que solo usas un dcg que analiza todo el archivo. Por curiosidad, ¿por qué debemos usar 'call (eos)' en lugar de una regla dcg? –

14

Usted puede utilizar read para leer la corriente. Recuerde invocar at_end_of_stream para asegurar que no haya errores de sintaxis.

Ejemplo:

readFile.pl

main :- 
    open('myFile.txt', read, Str), 
    read_file(Str,Lines), 
    close(Str), 
    write(Lines), nl. 

read_file(Stream,[]) :- 
    at_end_of_stream(Stream). 

read_file(Stream,[X|L]) :- 
    \+ at_end_of_stream(Stream), 
    read(Stream,X), 
    read_file(Stream,L). 

miArchivo.txt

'line 0'. 
'line 1'. 
'line 2'. 
'line 3'. 
'line 4'. 
'line 5'. 
'line 6'. 
'line 7'. 
'line 8'. 
'line 9'. 

Así invocando main va a recibir la salida:

?- main. 
[line 0,line 1,line 2,line 3,line 4,line 5,line 6,line 7,line 8,line 9] 
true 

Simplemente configure main. La salida aquí es un ejemplo usando write, por supuesto. Configure para que coincida con su solicitud.

Supongo que este principio se puede aplicar para responder a su pregunta. Buena suerte.

Cuestiones relacionadas