Я хотел бы перехватить запросы, передаваемые интерактивному интерпретатору Пролога, чтобы выполнить дополнительную обработку, например. для регистрации запросов.
На данный момент у меня есть следующий код, использующий крючок 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, вы можете использовать протокол/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
Это создаст запись того, что произошло, но, как вы видите, она также сохранит ваши данные.
Это ваш вариант использования? Есть много других вещей, которые вы могли бы сделать, но это действительно зависит от того, что вам нужно.