我想拦截传递给交互式 Prolog 解释器的查询,以便进行一些额外的处理,例如记录查询。
到目前为止,我有以下依赖于
goal_expansion
钩子的代码。
start_logging :-
open('queries.log', write, _, [alias(querylog)]),
assert(goal_expansion(X,X):-log(X)).
log(X) :-
X==stop_logging -> % do not log stop command
true
;
prolog_load_context(source,_) -> % do not log queries in loaded files
true
;
write_term(querylog,:- X,[fullstop,nl]).
stop_logging :-
close(querylog,[]),
retract(goal_expansion(X,X):-log(X)).
加载这些子句后,
start_logging
将使解释器将查询写入queries.log
,直到执行stop_logging
。
我的问题:
prolog_load_context(source,_)
对于未从文件中读取的目标失败。还有其他情况需要处理吗?如果您特别想使用 SWI-Prolog 记录交互式会话,您可以使用 protocol/1:
?- protocol('my_queries.txt').
true.
?- between(1, 3, X).
X = 1 ;
X = 2 ;
X = 3.
?- ^D
% halt
$ cat my_queries.txt
true.
between(1, 3, X).
X = 1 ;;
X = 2 ;;
X = 3.
% halt
这将创建所发生事件的记录,但正如您所见,它也会保留您的输入。
这是您的用例吗?您还可以做很多其他事情,但这实际上取决于您需要什么。