例如,如果我想获得所有可能的总和为 10 的自然数对,我该如何让 prolog 来做到这一点? 如果我的代码是这样的:
sumsTo10(X,Y):-
Z is X+Y,
Z == 10.
那么,是的,如果我问 5 和 5 之和是否为 10,我会得到 true 作为答案,但我想要这样的东西:
?-sumsTo10(A,B).
[1,9]
[2,8]
....
最佳答案
您可以在Finite D<上使用Cconstraint Logic P编程库/strong>omains ( clpfd
) 为此:
:- use_module(library(clpfd)).
sumsTo10(X,Y):-
[X,Y] ins 1..10,
X + Y #= 10,
label([X,Y]).
然后生成:
?- sumsTo10(X,Y).
X = 1,
Y = 9 ;
X = 2,
Y = 8 ;
X = 3,
Y = 7 ;
X = 4,
Y = 6 ;
X = Y, Y = 5 ;
X = 6,
Y = 4 ;
X = 7,
Y = 3 ;
X = 8,
Y = 2 ;
X = 9,
Y = 1.
第一行指定 X
和Y
位于 1..10
域(即 10(含 10),但这并不重要)。第二行是一个约束:它限制 X + Y
应等于 ( #=
) 到 10
。这仅添加了约束:它不会接地 X
和Y
到实际成立的值,但从那一刻起 X
和Y
(部分)接地,并且不满足约束,它将失败。例如,如果您设置 X
至10
,则可得出 Y
只能是0
,但自从 Y
位于 1..10
区间内,这是不可能的,因此系统将会失败。
最后使用label([X,Y])
我们将域中的值分配给 X
和Y
使得约束成立。
关于math - 在Prolog程序中求所有自然数解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46798452/