2016-05-03 7 views
2

Ich brauche die Swipl Console-Ausgabe (die Trace-Ausgabe) für eines meiner Projekte. Ich versuche, die JPL7-API zu verwenden, aber ich kann nicht scheinen, eine Methode zu finden, Ausgabe von der Swipl-Konsole zu ergreifen. Kann ich das irgendwie machen? Oder gibt es eine Abfrage, die ich ausführen kann, die die Ausgabe der Ablaufverfolgung in eine Datei leitet und dann von dort funktioniert?Wie bekomme ich die swi-prolog Konsolenausgabe mit JPL?

Vielen Dank im Voraus.

Antwort

2

können Sie versuchen, protocol/1 zu verwenden, dann durch leash(-all),trace

bearbeiten eine Lösung Präfix beginnen Ihre Abfrage-Datei zu ändern, auf Rückzieher: I in einem Modul (vielleicht namens trace_protocol retten würde: (?) -) und würde dann mit ?- [trace_protocol]. verwenden und anschließend ?- 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). 

Es dauerte Code viel, scheint da ein Fehler in nb_current/2 ist. Sollte nicht, aber es wirft eine Ausnahme - tatsächlich wird die Ausnahme aus der Bibliothek (clpfd) geworfen, auch wenn das nicht direkt in meinem Testmodul enthalten ist.

Die fortlaufend nummeriert * .tty Dateien am besten in Terminal angezeigt werden, zum Beispiel

$ cat *.tty 

seit Sequenzen Escape-Formatierung TTY geben. Vielleicht könnten solche Sequenzen mit ?- set_prolog_flag(color_term, false).

+1

abgelehnt werden Danke! Das hat funktioniert! Nur dass ich am Ende 'noprotocol' hinzufügen musste, um die Konsolenausgabe auf die Datei zu übertragen. – absolutelydevastated

+0

Ist es möglich, die Zieldatei, in der ich die Konsolenausgabe drucke, bei jeder anderen Lösung zu ändern? – absolutelydevastated

+0

nein, ich glaube nicht, dass es einfach ist ... Sie könnten versuchen, den Abfrageprozess zu "fahren" und das Protokoll/1 beim Zurückverfolgen aufzurufen, vielleicht einen Zeitstempel hinzufügend. Lassen Sie mich den Code zeigen, aber Sie müssen testen ... – CapelliC