プロローグで、次のようなすべての可能な計算を総当たりにすることができるかどうか疑問に思っていました:
6 is Z + Q
Z = 1 Q = 5
Z = 2 Q = 4
Z = 3 Q = 3
プロローグで、次のようなすべての可能な計算を総当たりにすることができるかどうか疑問に思っていました:
6 is Z + Q
Z = 1 Q = 5
Z = 2 Q = 4
Z = 3 Q = 3
Prolog がサポートしている場合は、Finite Domain ソルバーを使用することをお勧めします。
私は通常 GProlog を使用しており、次のような方法で質問を取得できます
fd_domain([A, B], 1, 100),
6 #= A + B,
fd_labeling([A, B]),
ここでfd_domain/3
、変数のドメインを設定しA
(B
から1
まで100
)、6 #= A + B
制約を設定し ( A + B
is 6)、fd_labelling/1
すべての可能な計算を取得します。
Swi-Prolog では少し異なります。
まず、CLP(FD) ライブラリをロードする必要があります。
:- use_module(library(clpfd)).
変数とドメインを設定するには、次のように記述できます
Vars = [A, B],
Vars ins 1..100,
制約の設定は等しい
6 #= A + B,
可能なすべての組み合わせを取得するには、次のように記述できます
label(Vars),
生成してテストするアプローチも機能します。もちろん、次のようないくつかの制約が必要です。
?- between(1, 6, X), % X is an integer between 1 and 6
between(1, 6, Y), % Y is an integer between 1 and 6
X =< Y, % X is not larger than Y
X + Y =:= 6. % the sum is 6
X = 1, Y = 5 ;
X = 2, Y = 4 ;
X = Y, Y = 3 ;
false.
サブクエリの順序は重要であるため、生成してからテストと呼ぶこともできます。いくつかの制約をハードコードすることを恐れないのであれば、いくつかの値の生成を回避し、いくつかのテストを不要にする方法があるかもしれません。例えば:
?- between(1, 6, X), % X is an integer between 1 and 6
between(X, 6, Y), % Y is an integer between X and 6
X + Y =:= 6. % the sum is 6
X = 1, Y = 5 ;
X = 2, Y = 4 ;
X = Y, Y = 3 ;
false.
その道を十分に進むことは、たとえば CLP(FD) のような制約ソルバーを実装することとほぼ同じであることを認識する必要があります。