3

所有的可能性我想知道是否在序言中就可以得到它的蛮力都这样的事情可能算了一笔账:获取序言给算术

6 is Z + Q 

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

回答

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. 

子查询的顺序是显著,所以你可能还不如说是生成,然后检验。如果你不怕硬编码的一些限制的,可能有办法,以避免产生一些值,并进行一些测试是不必要的,例如:

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

3

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

我通常使用GProlog,我能得到你喜欢的东西

fd_domain([A, B], 1, 100), 
6 #= A + B, 
fd_labeling([A, B]), 

其中fd_domain/3设置变量域AB(从1100),6 #= A + B设置约束问什么(A + B是6 )和fd_labelling/1得到所有可能的计算。

在Swi-Prolog中有些不同。

首先,你有

:- use_module(library(clpfd)). 

要设置变量和域加载CLP(FD)库,你可以写

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

设置约束等于

6 #= A + B, 

并且得到所有可能的组合,你可以写

label(Vars),