咨询原子
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, []).
可以使用 consult/1
或 [filename].
.
假设我将 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, []).