咨询原子

时间:2016-07-09 13:49:31

标签: prolog swi-prolog prolog-assert

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

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

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

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

2 个答案:

答案 0 :(得分: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)).

答案 1 :(得分:0)

对于后代,这是我如何做到的,只要你在列表的每个原子中只有一个术语:

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

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