prologswi-prologjpl

How to get swi-prolog console output using JPL?


I need the swipl console output (the trace output) for one of my projects. I'm trying to use the JPL7 API to do this but I can't seem to find a method to grab output from the swipl console. Is there a way I can do this? Or is there a query I can run that directs the trace output to a file and then work from there?

Thanks in advance.


Solution

  • you can try to use protocol/1, then start your query prefixed by leash(-all),trace

    edit a solution (?) to change file on backtracking: I would save in a module (maybe named trace_protocol :-) and then would use with ?- [trace_protocol]. and subsequently ?- trace,trace_protocol(append(X,Y,[1,2,3])).

    :- meta_predicate trace_protocol(0).
    
    trace_protocol :-
        Name = trace_protocol_index,
        catch(nb_getval(Name, N), _Exc, nb_setval(Name, 0)),
        % writeln(ex:Exc), 
        nb_current(Name, N),
        % writeln(nb_current(Name, N)), 
        M is N+1, nb_setval(Name, M),
        % writeln(nb_setval(Name, M)),
        format(atom(PN), '~s_~d.tty', [Name, N]),
        % writeln(trace_protocol:PN),
        protocol(PN).
    
    trace_protocol(Q) :- trace_protocol, forall(Q, trace_protocol).
    

    It took a lot to code, since seems there is a bug in nb_current/2. Should not, but it throws an exception - actually the exception is thrown from library(clpfd), even if that is not directly included in my test module.

    The sequentially numbered *.tty files are best shown in terminal, for instance

    $ cat *.tty
    

    since there are TTY formatting escape sequences. Maybe such sequences could be turned down with ?- set_prolog_flag(color_term, false).