Search code examples
ioprologswi-prologdcg

Read a file line by line in Prolog


I'd like to read a plain text file and apply a predicate to each line (the predicates contain write which does the output). How would I do that?


Solution

  • In SWI-Prolog, the cleanest solution is to write a DCG that describes what a "line" is, then call a predicate for each line. Use library(pio) to apply the DCG to a file.

    EDIT: As requested, consider:

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

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