让 Prolog 给出算术的所有可能性
Get Prolog to give all possibilities for arithmetic
我想知道在 prolog 中是否有可能让它对所有可能的计算进行暴力破解:
6 is Z + Q
Z = 1 Q = 5
Z = 2 Q = 4
Z = 3 Q = 3
如果您的 Prolog 支持,我建议使用有限域求解器。
我一般用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
是 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) 这样的约束求解器大致相同。
我想知道在 prolog 中是否有可能让它对所有可能的计算进行暴力破解:
6 is Z + Q
Z = 1 Q = 5
Z = 2 Q = 4
Z = 3 Q = 3
如果您的 Prolog 支持,我建议使用有限域求解器。
我一般用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
是 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) 这样的约束求解器大致相同。