0

consult/1可以使用或轻松查阅 Prolog 文件[filename].

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

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

我将如何做同样的事情但不将X(代码)写入文件?我没有运气assert将术语作为输入,而在这里我在原子中有完整的代码。

4

2 回答 2

3

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

但是,如果您真的想使用原子,然后将它们视为结构化术语,请使用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))。
于 2016-07-09T14:03:13.073 回答
0

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

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

read_term_from_atom_(A, B) :-
    read_term_from_atom(A, B, []).
于 2016-07-09T14:52:13.190 回答