如何将a
定义为整数/浮点数?
我想找到a+b+c+d=10
a,b,c,d
为整数且>=0
的结果。
答案 0 :(得分:5)
使用SWI-Prolog,您可以使用CLP(FD)库
1 ?- use_module(library(clpfd)).
% library(error) compiled into error 0.00 sec, 9,764 bytes
% library(clpfd) compiled into clpfd 0.05 sec, 227,496 bytes
true.
2 ?- Vars=[A,B,C,D],Vars ins 0..10,sum(Vars,#=,10),label(Vars).
Vars = [0, 0, 0, 10],
A = 0,
B = 0,
C = 0,
D = 10 ;
Vars = [0, 0, 1, 9],
A = 0,
B = 0,
C = 1,
D = 9 ;
Vars = [0, 0, 2, 8],
A = 0,
B = 0,
C = 2,
D = 8 ;
Vars = [0, 0, 3, 7],
A = 0,
B = 0,
C = 3,
D = 7 ;
...
答案 1 :(得分:4)
这是一个简单,现代,纯粹的Prolog,非CLP库解决方案:
range(X):-
member(X,[0,1,2,3,4,5,6,7,8,9,10]).
ten(A,B,C,D):-
range(A),
range(B),
range(C),
range(D),
10 =:= A + B + C + D.
答案 2 :(得分:2)
这是GNU-Prolog代码片段,在有限域上进行约束求解:
$ gprolog
| ?- [user].
compiling user for byte code...
ten(A,B,C,D) :- fd_domain([A,B,C,D],0,9999999), 10 #= A + B + C + D.
Ctrl + D
| ?- ten(A,B,C,D), fd_labeling([A,B,C,D]).
正如您所看到的,它解决了大范围的问题,如0-9999999
A = 0
B = 0
C = 0
D = 10 ? ;
A = 0
B = 0
C = 1
D = 9 ? ;
A = 0
B = 0
C = 2
D = 8 ? ;
...
P.S。感谢PrzemysławKobylański的blog with clear, very nice Prolog examples,我在那里找到了鼓舞人心的例子。
P.P.S。使用有限域时,您可能希望使用fd_set_vector_max/1。在上面的情况下,它不是必需的,但取决于约束可能是有用的 - 当Gnu-Prolog对范围进行操作时更多细节,当在可能值的向量上时,can be found at manual "Finite domain solver and built-in predicates - Introduction"