math - 在Prolog程序中求所有自然数解

标签 math prolog

例如,如果我想获得所有可能的总和为 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.

第一行指定 XY位于 1..10域(即 10(含 10),但这并不重要)。第二行是一个约束:它限制 X + Y应等于 ( #= ) 到 10 。这添加了约束:它不会接地 XY到实际成立的值,但从那一刻起 XY (部分)接地,并且不满足约束,它将失败。例如,如果您设置 X10 ,则可得出 Y只能是0 ,但自从 Y位于 1..10 区间内,这是不可能的,因此系统将会失败。

最后使用label([X,Y])我们将域中的值分配给 XY使得约束成立。

关于math - 在Prolog程序中求所有自然数解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46798452/

相关文章:

java - 如何避免 double 的舍入错误?

algorithm - "2"在 0 到 n 的所有数字中出现了多少次

prolog - 删除第二次和第三次出现的元素

list - Prolog - 返回矩阵的第 n 行

prolog - "Not"在 Prolog 中如何工作?

algorithm - 编写自己的平方根函数

c++ - 将 while 循环转换为数学公式

java - 从 JAVA 中将数字四舍五入到 10^

prolog - 如何检查列表列表中的所有元素是否相同(除了一个)[Prolog]

list - Prolog:过滤列表?