Prologでは、最初に述語に格納された値を取得し、次に値を再計算し、最後にretractall
andを使用して値を格納することによって、いくつかの算術計算 (またはプログラム全体で重要な状態情報) を含むコードを記述することがよくあります。assert
を使用して変数に値を2回割り当てることはできませんis
(したがって、変更が必要なほとんどすべての変数がグローバルになります)。これは Prolog では良い習慣ではないことがわかりました。この点について、私は次のように尋ねたいと思います。
Prologでそれが悪い習慣なのはなぜですか(私自身は、一種の柔軟な(変更可能な)変数を持つためだけに上記の手順を実行するのは好きではありませんが)?
この慣行を回避する一般的な方法にはどのようなものがありますか? 小さな例は大歓迎です。
PS Prologの学習を始めたばかりです。C言語などのプログラミング経験があります。
さらに明確にするために編集
私が言いたいことの悪い例 (win-prolog) を以下に示します。
:- dynamic(value/1).
:- assert(value(0)).
adds :-
value(X),
NewX is X + 4,
retractall(value(_)),
assert(value(NewX)).
mults :-
value(Y),
NewY is Y * 2,
retractall(value(_)),
assert(value(NewY)).
start :-
retractall(value(_)),
assert(value(3)),
adds,
mults,
value(Q),
write(Q).
次に、次のようにクエリできます。
?- start.
ここでは、非常に些細なことですが、実際のプログラムやアプリケーションでは、上記のグローバル変数の方法は避けられません。...のような上記のリストassert(value(0))
が非常に長くなり、より多くの変数を定義するためのアサート述語がさらに多くなることがあります。これは、異なる関数間の値の通信を可能にし、プログラムの実行中に変数の状態を保存するために行われます。
最後に、もう 1 つ知りたいことがあります。回避するためにさまざまな解決策が提案されているにもかかわらず、上記の慣行が避けられなくなるのはいつですか。