Prolog算术语法

5

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

我想找到a+b+c+d=10的结果,其中a,b,c,d是整数且>=0


已经在我的答案中添加了一个解决方案。 - kingchris
3个回答

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

首先,定义4个变量,然后为变量定义域(从0到10),然后添加约束条件(所有变量的和等于10),最后的语句(label(Vars))会导致搜索(通过回溯)所有可能的变量值。 - Volodymyr Gubarkov
ins和#=是CLP的关键字吗?我以前在Prolog中从未见过它们。 - user198729

5
这是一个简单、现代、纯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.

有没有更简单的方法来表示010?当问题的范围是0100时,我很担心... - user198729
SWI Prolog有“between/3”谓词。 “between(0,100,X)”将依次将X绑定到0..100(包括边界)。 - ThomasH
gnu-prolog 中,between/3 可以在 GNU Prolog 兼容层 中找到。另外,相关的 stackoverflow 问题是:Prolog Compatibility Layers - available programming libraries - Grzegorz Wierzowiecki
这个答案启发了我,让我想到了一个相关的问题,这里是内部链接 :)。 - Grzegorz Wierzowiecki

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

附言:感谢Przemysław Kobylański提供的博客,其中包含清晰、非常好的Prolog示例,我从中找到了启发性的例子。

另外提示:在使用有限域时,您可能会喜欢使用fd_set_vector_max/1。在上述情况下不需要它,但根据约束条件可能会很有用-有关更多细节,请参见手册中的“有限域求解器和内置谓词-介绍”,当Gnu-Prolog操作范围时,当操作可能值的向量时,可以找到


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接