0

私のプログラムには動的句があり、正常に動作しますが、プログラムを閉じると消えます。

私はそれを試しました

saveState :-
  write_pl_state_file('backup.dat').

loadState :-
  file_exists('backup.dat'),
  read_pl_state_file('backup.dat'); !.

しかし、これは機能しません。

このデータベースをファイルに保存する方法はありますか?

4

2 に答える 2

1

述語write_pl_state_file/1read_pl_state_file/1は、用語の解析に影響を与える情報/状態 (つまり、演算子の定義、文字変換 ​​Prolog フラグなど) に関連付けられています。

これは (おそらく) 解決策の一部ですが、より基本的には、おそらくファイルを調べて元に戻すことができる形式で、動的句の定義を保存したいと考えています。

述語listing/0はこのようなことを行いますが、動的節をファイルではなく「コンソール」に表示します。おそらく、出力をファイル (ストリーム) にリダイレクトできるようにする、基礎となる述語 Portrait_clause/2を使用することをお勧めします。

著者の Daniel Diazは、バージョン 1.4.0 の最近のリリース ノートで、 reactor_clause/2のわずかな変更(出力の末尾に改行を追加) を指摘しています。 .

追加した:

バージョン 1.3.2 以降、GNU Prolog は、listing/0出力の現在のストリームへの送信をサポートしているようです (1.3.1 以前のようにコンソールだけではなく)。

テストケースは次のとおりです。

| ?- assertz(whoami(i)).
| ?- assertz(whoami(me)).
| ?- assertz(whoami(myself)).

動的述語whoami/1の 3 つの節 (事実) を作成します。

次に、次のクエリを使用してファイル myClauses.pl を作成しました。

| ?- open('myClauses.pl',write,S), set_output(S), listing, close(S).

ストリーム S が閉じられると、現在の出力がコンソールにリセットされます。

ファイル myClauses.pl には空白行が含まれており、その後に 3 つの句が続くため、ソース コードは参照するのに適切な形式になっています。しかし、Windows に新しくインストールした GNU Prolog 1.4.0 の Consult /1述語 (およびその File -> Consult... メニューに相当するもの) に問題があります。コンパイルはコマンド ラインから実行され、 load/1がコンソールで正しく処理できるバイトコード ファイルを生成するため、設定方法に小さな問題があります。バグレポートを送信して、それを解決したら、さらにメモを投稿します。Linux ではまだ試していません。

于 2011-11-13T15:51:27.600 に答える
0

current_predicate/1またはを使用predicate_property/2して述語にアクセスしたりclause/2、述語の句にアクセスしたりできます。

次に、その情報を使用して保存ユーティリティを作成できます。

于 2011-11-15T18:15:34.867 に答える