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
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.
yes - you need to do what you'd do in any other language.
Open and read the file, parse the contents, and convert into terms that you can then assert.
Fortunately, you're in prolog, so 'parse the contents' is a task the language does for breakfast.
It turns out I've been writing a tutorial on how to do pretty much this exact task. It's not quite finished, but is online at
http://www.pathwayslms.com/swipltuts/dcg/
If your files are large, use the method described in the tutorial to read them. Otherwise, just bring the file into a 'codes' style string and go on with life.
You can do any 'normal' prolog in a DCG by enclosing it in {}
some_nonterminal --> "fridge", blanks, [X], { % you can put any normal Prolog code in here assert(fridge_named(X)) }.
This looks for a sequence like
fridge G
and asserts fridge_named(0x47) in the database (Ascii G is 0x47)