write swi salida programas listas explicados entrada ejercicios ejemplos desde datos comandos cero aprender io prolog swi-prolog dcg

io - swi - Lea un archivo línea por línea en Prolog



prolog pdf (2)

Me gustaría leer un archivo de texto sin formato y aplicar un predicado a cada línea (los predicados contienen write que hace la salida). ¿Como podría hacerlo?


Puede usar read para leer la secuencia. Recuerde invocar at_end_of_stream para garantizar 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).

myFile.txt

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

Por lo tanto, al invocar main recibirás el resultado:

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

Solo configura 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.


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 : según lo solicitado, considere:

:- 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).

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