在 SWI-Prolog 中记录交互式查询

问题描述 投票:0回答:1

我想拦截传递给交互式 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,_)
    对于未从文件中读取的目标失败。还有其他情况需要处理吗?
logging prolog hook interpreter swi-prolog
1个回答
0
投票

如果您特别想使用 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

这将创建所发生事件的记录,但正如您所见,它也会保留您的输入。

这是您的用例吗?您还可以做很多其他事情,但这实际上取决于您需要什么。

© www.soinside.com 2019 - 2024. All rights reserved.