如何定义 a 作为整数/浮点数?

我想找到以下结果 a+b+c+d=10 在哪里 a,b,c,d 是整数并且 >=0.

有帮助吗?

解决方案

下面是一个简单的,现代的,纯的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.

其他提示

与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 ;
...

这是 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.

控制键 + 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 ? ;
...

附:感谢 Przemysław Kobylanski 的贡献 博客中有清晰、非常好的 Prolog 示例, ,我在那里找到了鼓舞人心的例子。

附言在处理有限域时,您可能喜欢使用 fd_set_vector_max/1 。在上面的情况下,它是不需要的,但取决于约束可能是有用的 - 当 Gnu-Prolog 在范围上操作时,当在可能值的向量上操作时,更多细节, 可以在手册“有限域求解器和内置谓词 - 简介”中找到

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top