Prologリストを作成した後にクエリを実行すると、Prologはどのようにスコープを使用してそれを解決しますか?カット演算子が結果に影響を与える可能性があることを理解してい!
ます。スコープに影響を与えることでこれを行いますか?
1 に答える
まず最初に:プロローグは動的スコープを使用しますか?いいえ、そうではありません。そうでない理由は、prologが定義された変数を追跡する必要があるためです。そのため、新しい割り当ては、その変数名に割り当てられた最後の値ではなく、初期変数を参照します。
一方、Bashは動的スコープを使用するため、ループで変数i
をfor
使用しi
、ループの実行中に呼び出されるかどうかに関係なく、別の関数で変数を使用すると、互いのi
値に影響します。 。
これはあまり簡単ではないかもしれないので、例:
#!/bin/bash
function my_first_I() {
I=10;
}
function my_second_I() {
I=100;
}
I=1; echo $I;
my_first_I; echo $I;
my_second_I; echo $I;
出力:
$ ./script.sh
1
10
100
ここでの秘訣は、変数が別の変数と考えられていることを台無しにしていることです。
さて、あなたが知っているかもしれないように、あなたはプロローグでこれをすることができません:
#!/usr/bin/swipl
my_first_I(I) :- I is 10.
my_second_I(I) :- I is 100.
test(I) :-
I is 1,
write(I), nl,
my_first_I(_),
write(I), nl,
my_second_I(_),
write(I), nl.
出力:
?- test(I).
1
1
1
I = 1.
この例は、プロローグでは、変数が独自のローカルスコープで定義されており、別の関数の定義に漏れがないことを単に示しています。
さて、2番目の部分:どのように機能し!
ますか?Prologによって生成された論理プログラミングソリューションは、統合アルゴリズムの適用後に導出されます。プロセス中に、ツリーのような構造がDFS方式で構築され、変数が想定する値に従ってステートメントの評価を実行します。各リーフレベルの拡張の後、Prologは次に利用可能な拡張に戻ります。
が見つかった場合!
、幅の拡張は停止され、ローカルソリューションの他の可能な値が切り捨てられ、ツリーのより深い拡張のみが実行されます。これは、演算子の非常に簡単な使用法です!
。