Как перенаправить вывод трассировки в файл

Я отслеживаю программу на прологе

1 ?- trace.
true.

[trace] 1 ?- solve.
   Call: (7) solve ? 

я тоже пробовал

tell('trace_op.txt').

файл создан, но пустой

Теперь след действительно много строк. Я хочу перенаправить вывод в файл. Можем ли мы перенаправить его в файл?


person Star123    schedule 17.10.2016    source источник
comment
Какую операционную систему ты используешь?   -  person lurker    schedule 18.10.2016
comment
Я использую Windows 8   -  person Star123    schedule 19.10.2016


Ответы (2)


В Windows с помощью SWI-Prolog вы можете использовать protocol/1

protocol/1 скопирует вывод, который идет на экран в файл. Таким образом, если вы запустите trace/0 и результат будет на экран, копия будет отправлена ​​в файл. Чтобы упростить запись полного пути для protocol/1, мне проще установить текущий рабочий каталог, используя working_directory/2, а затем установите только конкретный файл с протоколом/1.

Пример

Для этого примера создайте файл, например.

trace_example.pl

и добавьте некоторые факты и предикаты, чтобы продемонстрировать трассировку.

parent(ann,helen).
parent(helen,henry).
parent(henry,mary).

ancestor(X,Y) :- parent(X,Y).
ancestor(X,Y) :- parent(X,Z),
    ancestor(Z,Y).

Откройте верхний уровень SWI-Prolog и используйте consult/1 для загрузить файл

consult("C:/ ... /trace_example.pl").

Н.Б. Разделители каталогов / не \. При необходимости измените их.

Поскольку терминал SWI-Prolog в Windows по умолчанию будет использовать цвет с трассировкой, что добавит ненужные управляющие последовательности в выходной файл set_prolog_flag/2 необходимо запустить, чтобы отключить цвет.

?- set_prolog_flag(color_term,false).
true.

Убедитесь, что терминал не использует цвет.

?- current_prolog_flag(color_term,X).
X = false.

Быстрый прогон для проверки предиката и фактов

?- ancestor(ann,henry).
true ;
false.

Теперь установите текущий рабочий каталог, в котором будет создан выходной файл.

?- working_directory(_,"C:/Users/Eric/Documents/Prolog").

и убедитесь, что изменение произошло

?- working_directory(CWD,CWD).
CWD = 'c:/users/eric/documents/prolog/'.

Поскольку я не хочу нажимать пробел для каждого вывода трассировки, я отключаю взаимодействие с пользователем для всех портов отладки, используя поводок/1

?- leash(-all).

и поскольку я хочу видеть все выходные данные всех портов отладки, я включаю их все с помощью видимый/1

?- visible(+all).

Включить копирование экрана в файл

?- protocol("./trace_output.txt").

запустить трассировщик

?- trace.

и запустите запрос для трассировки

?- ancestor(ann,henry).

   Call: (8) ancestor(ann, henry) ? creep
   Call: (9) parent(ann, henry) ? creep
   Fail: (9) parent(ann, henry) ? creep
   Redo: (8) ancestor(ann, henry) ? creep
   Call: (9) parent(ann, _1124) ? creep
   Exit: (9) parent(ann, helen) ? creep
   Call: (9) ancestor(helen, henry) ? creep
   Call: (10) parent(helen, henry) ? creep
   Exit: (10) parent(helen, henry) ? creep
   Exit: (9) ancestor(helen, henry) ? creep
   Exit: (8) ancestor(ann, henry) ? creep
true ;
   Redo: (9) ancestor(helen, henry) ? creep
   Call: (10) parent(helen, _1124) ? creep
   Exit: (10) parent(helen, henry) ? creep
   Call: (10) ancestor(henry, henry) ? creep
   Call: (11) parent(henry, henry) ? creep
   Fail: (11) parent(henry, henry) ? creep
   Redo: (10) ancestor(henry, henry) ? creep
   Call: (11) parent(henry, _1124) ? creep
   Exit: (11) parent(henry, mary) ? creep
   Call: (11) ancestor(mary, henry) ? creep
   Call: (12) parent(mary, henry) ? creep
   Fail: (12) parent(mary, henry) ? creep
   Redo: (11) ancestor(mary, henry) ? creep
   Call: (12) parent(mary, _1124) ? creep
   Fail: (12) parent(mary, _1124) ? creep
   Fail: (11) ancestor(mary, henry) ? creep
   Fail: (10) ancestor(henry, henry) ? creep
   Fail: (9) ancestor(helen, henry) ? creep
   Fail: (8) ancestor(ann, henry) ? creep
false.

закончить отслеживание

?- nodebug.

и завершите копирование экрана в файл

?- noprotocol.

Теперь откройте файл C:\Users\Eric\Documents\Prolog\trace_output.txt

true.  
  
10 ?- trace.  
  
  
true.  
  
[trace] 10 ?- ancestor(ann,henry).  
  
  
   Call: (8) ancestor(ann, henry)  
   Unify: (8) ancestor(ann, henry)  
   Call: (9) parent(ann, henry)  
   Fail: (9) parent(ann, henry)  
   Redo: (8) ancestor(ann, henry)  
   Unify: (8) ancestor(ann, henry)  
   Call: (9) parent(ann, _6466)  
   Unify: (9) parent(ann, helen)  
   Exit: (9) parent(ann, helen)  
   Call: (9) ancestor(helen, henry)  
   Unify: (9) ancestor(helen, henry)  
   Call: (10) parent(helen, henry)  
   Unify: (10) parent(helen, henry)  
   Exit: (10) parent(helen, henry)  
   Exit: (9) ancestor(helen, henry)  
   Exit: (8) ancestor(ann, henry)  
true  ;  
   Redo: (9) ancestor(helen, henry)  
   Unify: (9) ancestor(helen, henry)  
   Call: (10) parent(helen, _6466)  
   Unify: (10) parent(helen, henry)  
   Exit: (10) parent(helen, henry)  
   Call: (10) ancestor(henry, henry)  
   Unify: (10) ancestor(henry, henry)  
   Call: (11) parent(henry, henry)  
   Fail: (11) parent(henry, henry)  
   Redo: (10) ancestor(henry, henry)  
   Unify: (10) ancestor(henry, henry)  
   Call: (11) parent(henry, _6466)  
   Unify: (11) parent(henry, mary)  
   Exit: (11) parent(henry, mary)  
   Call: (11) ancestor(mary, henry)  
   Unify: (11) ancestor(mary, henry)  
   Call: (12) parent(mary, henry)  
   Fail: (12) parent(mary, henry)  
   Redo: (11) ancestor(mary, henry)  
   Unify: (11) ancestor(mary, henry)  
   Call: (12) parent(mary, _6466)  
   Fail: (12) parent(mary, _6466)  
   Fail: (11) ancestor(mary, henry)  
   Fail: (10) ancestor(henry, henry)  
   Fail: (9) ancestor(helen, henry)  
   Fail: (8) ancestor(ann, henry)  
false.  
  
[trace] 11 ?-  nodebug.  
  
  
true.  
  
12 ?- noprotocol.  
person Guy Coder    schedule 27.03.2017
comment
Последовательности управления ANSI теперь окрашены. Это то, что вы хотите? - person false; 01.04.2017
comment
-all синий, а +all черный. Улучшает ли это читаемость? - person false; 01.04.2017

линукс

Если вы используете Linux, вы можете использовать команду tee:

$ swipl 2>&1 | tee swipl.log
...
1 ?- trace.
true.

[trace] 1 ?- solve.
   Call: (7) solve ? 
...

Команда tee отправляет весь свой стандартный ввод на стандартный вывод и в указанный файл параллельно. 2>&1 гарантирует, что вы также зафиксируете любую стандартную ошибку в стандартном выводе, чтобы она отображалась в файле swipl.log.

Окна

В Windows, если вы используете PowerShell, вы можете использовать команду Tee-Object, которая работает аналогично:

swipl-win | Tee-Object -file swipl.log

Я предполагаю, что swipl-win — это программа командной строки для SWI Prolog в Windows, и что она существует в вашем пути к программе для PowerShell.

Когда вы выйдете из swipl, вы сможете увидеть все, что произошло в swipl.log.

person lurker    schedule 18.10.2016
comment
Я использую Windows 8 - person Star123; 19.10.2016
comment
PS C:\› свернуть | Tee-Object -file swipl.log swipl : Термин «swipl» не распознается как имя командлета, функции, файла сценария или действующее написание имени, или, если путь был включен, убедитесь, что путь исправьте и попробуйте еще раз. В строке: 1 символ: 1 + swipl | Tee-Object -file swipl.log + ~~~~~ + CategoryInfo: ObjectNotFound: (swipl:String) [], CommandNotFoundException + FullyQualifiedErrorId: CommandNotFoundException - person Star123; 19.10.2016
comment
@ Star123, извините, swipl - это то, как команда SWI Prolog называется в Linux. Я только что снова отредактировал свой ответ, когда искал его в руководстве, и команда в Windows - swipl-win.exe (я полагаю). Вам нужно будет заменить то, что есть в Windows, и убедиться, что оно находится на пути, чтобы PowerShell мог его найти. Это то, о чем говорит вам сообщение об ошибке. - person lurker; 19.10.2016