If Clause is a list, the list elements are taken as static Prolog clauses and compiled as if they occurred in a file. Otherwise, if Clause is an atom or a compound term, it is itself compiled as a Prolog clause. This predicate works exactly as if all the clauses in the list were written into a file and this file was then compiled using compile/1. The difference between compile_term/1 and assert/1 is that the predicates for which clauses are compiled are not necessarily dynamic with compile_term/1, unless explicitly declared as such. Therefore clauses compiled with compile_term/1 usually replace the existing ones for the same predicate, moreover their source form is not available. On the other hand, compile_term/1 is faster than assert/1. Therefore, it can be used instead of assert/1 if the properties of dynamic procedures are not required.
Unlike compiling a file, when an event occurs which is not just a warning, the following clauses are not compiled, the compilation is aborted.
Success: compile_term([p(a), p(b), q(1), r("abc")]). compile_term([:- coroutine, delay p(X) if var(X)]). compile_term(p(X) :- q(X)). [eclipse]: compile_term([[a]]). (Error 66). warning: modifying a system predicate in '.' / 2 yes. [eclipse]: [X]. % The system predicate was redefined. X = a yes. % Compile_term/1 can be used for conditional compilation: :- (exists('/usr/ucb') -> S = bsd; S = sysV), compile_term(os(S)). % Even a whole procedure can be conditionally compiled: :- os(bsd) -> compile_term([ (pred1(X) :- pred2(X), pred3(X)), (pred1(Y) :- ... )]). Error: compile_term([p|X]). (Error 4). compile_term([a|b]). (Error 5). compile_term("a"). (Error 130). compile_term(["a" :- b]). (Error 130). compile_term([p(X) :- 1]). (Error 131). compile_term([a, b, a]). (Error 134). compile_term(!). (Error 135). compile_term([(p :- write(a)), write(b)]). (Error 137). compile_term(:- var(a)). (Error 143). compile_term(delay functor(A, _, _) if var(A)). (Error 275).