SWI Prolog と Windows 7 でコードを実行しています。私のコードでは、'win_exec()' を使用して別のアプリケーションを呼び出しています (メソッド 'shell()' を使用してみましたが、機能しません)。 end は、その出力をテキスト ファイルに生成します。ただし、場合によっては 30 分ほど実行されることもあります。これで、プロローグ コードはこの出力テキスト ファイルを使用して、さらに解析し、処理します。これは、他のアプリケーションを呼び出してその出力ファイルを使用するために使用するコードです。
main(Value,X) :- win_exec('C:\\myfolder\\external_app.bat C:\\myfolder\\outputfile.txt', normal),
open('C:\\myfolder\\outputfile.txt', read, Mf),
read_file(Mf, X), % PROCEDURE TO READ FILE CONTENTS
close(Mf),
statistics(cputime, Value). % CALCULATE HOW LONG IT TOOK
ただし、ファイルは別のアプリケーションによって出力されていないため、次のエラーが発生します。
ERROR: open/4: source_sink `C:\myfolder\outputfile.txt' does not exist (No such file or directory)
したがって、回避策として、エラーをキャッチし、「existence_error」と比較して処理し、最終的に成功するまで、つまり他のアプリケーションが処理を完了して出力ファイルが生成されるまで、open プロシージャを再帰的に呼び出します。これは、これに対する私の回避策のコードです:
main(Value,X) :- win_exec('C:\\myfolder\\external_app.bat C:\\myfolder\\outputfile.txt', normal),
open_output(X), % PROCEDURE FOR FILE EXCEPTION HANDLING
statistics(cputime,Value).
open_output(X) :- catch((open('C:\\myfolder\\outputfile.txt', read, Mf), read_file(Mf,X), close(Mf)),
error(Err,Context),
open_output_aux(Err,X)). % AUX PROCEDURE TO RECOVER
% Write some code here
% open_output_aux code matches the error code with 'existence_error';
% if true, calls open_aux_wait procedure; else throw the error.
open_aux_wait(Z):- catch((open('C:\\myfolder\\outputfile.txt', read, Mf), read_file(Mf,Z), close(Mf)),
error(Err,Context),
open_aux_wait(Z)).
ただし、これを行う方法は非常に非効率的です。Javaのように、これを行うためのより良い方法があるかどうかを知りたかったのですが、ファイル例外の処理中に単にwait()を呼び出すことができます。ドキュメントには、メソッド「wait_for_input\3」がありますが、「wait_for_input()」は Windows のファイル ストリームには使用できないと書かれています。使ってみましたが、エラーになります。
ヘルプやガイドラインは大歓迎です。