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),