1

プロローグで実行を遅らせるにはどうすればよいですか? threadDelay msHaskell でmsミリ秒単位で遅延させることができます。プロローグでこれを行う方法はありますか? つまり、おそらく次のような一連の空のクエリを実行できます

delay(0).
delay(X) :- delay(Y), Y is X - 1.

しかし、それは愚かで間違った考えのようです。

編集:

どうやらsleep/1. しかし、私が何かをするとき

delayText([H|T]) :- put_char(H), sleep(0.1), delayText(T).
delayText([]).

、スリープが最初に実行され(クエリなどで.5秒間スリープするためdelayText("Hello").)、すべてのテキストが一度に表示されますか?これを防ぐにはどうすればよいですか?

4

1 に答える 1

1

私の答えを形式化するために、SWI-Prolog ではsleep/1、プロセスを遅らせるために使用できます。このリストには ISO 述語が見当たりませんし、期待もしていません。なぜなら、標準ではスレッド化やその他の低レベル OS の問題についてあまり指定されていないからです。

修正delayText/1するには、追加するだけですflush_output。これは基本的hFlush stdoutに Haskell の場合と同じですが、Haskell の出力ストリームのフラッシュ モードを で変更することもできますhSetBuffering。の SWI バージョンはオプションをopen/4サポートしていbufferますが、これは ISO ではないことが言及されているため、フラッシュを自動的に発生させたり、出力をバッファリングしないようにする ISO の方法はおそらくないでしょう。私が間違っている場合は修正してください。

修正されたコードは次のようになります。

delayText([H|T]) :- put_char(H), flush_output, sleep(0.1), delayText(T).
delayText([]).

私はおそらく次のように書くでしょう:

delay_put_char(X) :- put_char(X), flush_output, sleep(0.1).
delayText(X) :- maplist(delay_put_char, X).
于 2013-03-19T16:02:20.907 に答える