prolog

read file and construct facts in prolog


I would like to construct a mechanism that constructs different facts depending from txt file, imported in prolog. I already have found some examples where they directly assert the line that was read from the file, but I have to transform the data before assertion can take place.

To give an example:

man = {m1, m2}.

m1: w1 > w2.

should be read as:

man(m1).
man(m2).
prefer(m1, w1, 1).
prefer(m1, w2, 2).

Is it possible to construct these facts based on the symbols of the input?


Solution

  • thanks to the fact that data presented in example is valid Prolog syntax, this code will do

    load_file_data(File) :-
        open(File, read, Stream),
        repeat,
        read(Stream, Term),
        (   Term = end_of_file
        ->  true
        ;   process(Term),
            fail
        ),
        close(Stream).
    
    process(X = {L}) :-
        forall(arg(_, L, A), (F =.. [X, A], assert(F))).
    process(X : A > B) :-
        assert(prefer(X, A, 1)),
        assert(prefer(X, B, 2)).
    

    note that the precedence of operators in m1: w1 > w2 is not what we could expect, but it works anyway, thanks to complete pattern matching. Use

    ?- write_canonical(m1 : w1 > w2).
    >(:(m1,w1),w2)
    

    to check precedence when not sure.