4

多くのファクトを含むプロローグ データベース ファイルがありますknowledge.pl。例えば:

father_of(joe,paul).
father_of(joe,mary).
mother_of(jane,paul).
mother_of(jane,mary).
male(paul).
male(joe).
female(mary).
female(jane). % and so on.

このファイルは、プログラムが再度実行されるたびに参照されます (consult/1)。

このデータベース テキスト ファイル内で直接書き込みまたは削除することにより、必要なファクト (一部は直接、一部は特定の条件を満たすもの) を挿入、変更、および削除できるようにしたいと考えています。

assertz、retract、retractall のようなものですが、このテキスト ファイルを変更して、変更が永続的にそこに残るようにします。

どうすればできますか?

4

2 に答える 2

3

SWI-Prolog を使用している場合は、いくつかの選択肢があります。

プロローグの永続性を探していると、私は永続性に出くわしました:一見すると便利なモジュールです。

次に、「外部テーブル」用のライブラリがあります。つまり、ファイルに格納され、インデックスが作成されます。メモリに収まらないデータがある場合、またはデータ セット全体の読み込み/保存に時間がかかりすぎる場合は、これを使用する必要があります。

それ以外の場合、thanosQR からの回答は、永続性を処理する「昔ながらの」方法を示唆しています。

于 2012-06-01T22:27:50.723 に答える
3

必要なファクトを作成して (同じ) ファイルに書き込むか、データベースを変更してファイルに保存することができます。

違いは、最初のアプローチでは古いファイルのデータベースがロードされ、2 番目のアプローチでは実行中に変更されることです。

あなたの質問の言い方から、あなたは2番目のことをしたいと思います。これを行うには、次のことを行う必要があります。

1) 変更したいすべての述語を動的として宣言する 2) 実行中にアサート、リトラクトなど 3) 新しいデータベースをファイルに書き込む。あなたはlisting/1を使うことができます

書くには、次のようなことができます:

tell(knowledge),
.....
told.

または、他のio 述語を使用できます。おそらくset_prolog_IO/3を使用するのが最も簡単な方法でしょう。

ここで、最初のものが必要な場合は、述語 (おそらくuniv operatorを使用) またはその他の文字列操作述語を作成し、それらをファイルに書き込む必要があります。

編集:

list/0 がありますが、ロードされたすべての述語がリストされます (望ましくない可能性があります)。いくつか検索した後、source_file/2が見つかりました。だからあなたは次のようなことができます

findall(X,source_file(X,FileName),L).

source_file/2 には絶対ファイル名が必要であることに注意してください。あなたはそれを取得するためにabsolute_file_name/2を使用することができます。次のようにします。

save(FileName):-
    absolute_file_name(FileName,Abs),
    findall(X,source_file(X,Abs),L),
    tell(FileName),
    maplist(listing,L),
    told.

一方、ファイルのどこかに保存したい述語のリストをいつでも持つことができます

于 2012-06-01T21:23:23.483 に答える