获取Prolog以提供算术的所有可能性

时间:2016-11-22 23:07:07

标签: prolog constraints constraint-programming constraint-satisfaction

我想知道在prolog中是否有可能对这样的事情进行所有可能的计算:

6 is Z + Q

Z = 1 Q = 5
Z = 2 Q = 4
Z = 3 Q = 3

2 个答案:

答案 0 :(得分:3)

如果您的Prolog支持,我建议使用有限域解算器。

我通常使用GProlog,我可以用

之类的东西获得你所要求的东西
fd_domain([A, B], 1, 100),
6 #= A + B,
fd_labeling([A, B]),

其中fd_domain/3为变量AB设置了域(从1100),6 #= A + B设置了约束({ {1}}是6)并且A + B获得所有可能的计算。

在Swi-Prolog中有点不同。

首先,您必须使用

加载CLP(FD)库
fd_labelling/1

要设置变量和域,可以编写

:- use_module(library(clpfd)).

设置约束相等

Vars = [A, B],
Vars ins 1..100,

并获得所有可能的组合,您可以写

6 #= A + B,

答案 1 :(得分:2)

生成和测试方法也有效。当然,您仍然需要一些约束,例如:

?- 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.

子查询的顺序很重要,所以你也可以称之为generate-then-test。如果您不害怕对某些约束进行硬编码,可能有办法避免生成某些值,并且无需进行某些测试,例如:

?- 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)这样的约束求解器。