Регистрация интерактивных запросов в SWI-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,_) не работает для целей, не считанных из файла. Есть ли другие дела, о которых нужно позаботиться?

1
65
1

Ответ:

Решено

Если вы специально хотите зарегистрировать свой интерактивный сеанс с помощью 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

Это создаст запись того, что произошло, но, как вы видите, она также сохранит ваши данные.

Это ваш вариант использования? Есть много других вещей, которые вы могли бы сделать, но это действительно зависит от того, что вам нужно.