咨询原子

Consulting an atom

可以使用 consult/1[filename]..

轻松查阅 Prolog 文件

假设我将 Prolog 代码生成为一个原子。我可以在谓词中将该代码写入文件然后查询它,并从该代码查询谓词,例如

example :-
    generate_stuff(X),
    write_to_file(X,'filename.pl'),
    consult('filename.pl'),
    predicate_in_filename.

如果不将 X(代码)写入文件,我将如何做同样的事情?我对 assert 不走运,它接受一个术语作为输入,而这里我有完整的原子代码。

干净的方法当然是不是甚至首先产生一个原子,而是从一开始就产生一个更结构化的表示。

但是,如果您真的想使用原子并稍后将它们视为结构化术语,请使用 atom_to_term/3,然后断言子句。

例如:

?- atom_to_term('p(X, Y) :- dif(X, Y)', T, Vs).
T =  (p(_G925, _G926):-dif(_G925, _G926)),
Vs = ['X'=_G925, 'Y'=_G926].

在你的情况下,你可以简单地忽略 Vs:

?- atom_to_term('p(X, Y) :- dif(X, Y)', T, _).
T =  (p(_G916, _G917):-dif(_G916, _G917)).

为了后代,我是这样做的,前提是你在列表的每个原子中只有一个术语:

%...
maplist(read_term_from_atom_, ListOfAtoms, ListOfTerms),
maplist(asserta, ListOfTerms),
%...

read_term_from_atom_(A, B) :-
    read_term_from_atom(A, B, []).