gpt4 book ai didi

prolog - 生成毕达哥拉斯三元组到无穷大

转载 作者:行者123 更新时间:2023-12-01 15:48:07 25 4
gpt4 key购买 nike

我要生成所有毕达哥拉斯三元组 (每次用户通过在 prolog 中使用 ; 要求新的解决方案时生成一个新的三元组)。

我试图修改下面的代码,它显示了给定 N 值(最大限制)的所有勾股数三元组。

生成高达给定值 N 的三元组的原始算法:

pythagora(X,Y,Z,N) :-
length(_, N),
between(1,N,X),
between(1,N,Y),
between(1,N,Z),
Z*Z =:= X*X + Y*Y.

我试图消除最大限制数 N 并将其替换为 infinfinite但显然程序死了。除了 between,我还能使用哪些谓词?生成数字进行测试?

我的尝试如下:
pythagora(X,Y,Z):- between(1,inf,X), between(1,inf,Y), between(1,inf,Z), Z*Z =:= X*X + Y*Y.

我对 Prolog 完全陌生,所以如果问题看起来很幼稚,我深表歉意。我希望你能告诉我正确的方法来实现我的目标。谢谢你。

最佳答案

您提出的方法的问题在于 XY通过 between/3 设置电话,然后 Z也设置好了。现在不管是否Z*Z =:= X*X + Y*Y与否,我们只会增加 Z ,直到无穷大。所以在 Z 的某个值之后, 永远不会再生成勾股三元组,但是 between/3将继续为 Z 提出新值.

我们可以通过先设置Z来解决问题(这里总是三元组的最大值)。那么我们知道XY将始终在 1 之间和 Z (好吧,界限可以设置得更“紧”,但我将此作为练习),因此我们可以将其实现为:

pythagora(X,Y,Z) :-
between(1, inf, Z),
between(1, Z, X),
between(1, Z, Y),
Z*Z =:= X*X + Y*Y.

XYbetween/3 统一调用,使用有限数量的值,我们确信这些调用最终会结束,因此我们将尝试为 Z 寻找更高值的三元组。 .

通过这种方法,我们得到:
?- pythagora(X, Y, Z).
X = 3,
Y = 4,
Z = 5 ;
X = 4,
Y = 3,
Z = 5 ;
X = 6,
Y = 8,
Z = 10 ;
X = 8,
Y = 6,
Z = 10 ;
X = 5,
Y = 12,
Z = 13 ;
X = 12,
Y = 5,
Z = 13 ;
X = 9,
Y = 12,
Z = 15

这里有一些重复,所以我们可以决定添加一个额外的限制 X总是小于 Y :
pythagora(X,Y,Z) :-
between(1, inf, Z),
between(1, Z, X),
between(X, Z, Y),
Z*Z =:= X*X + Y*Y.

然后我们得到:
?- pythagora(X, Y, Z).
X = 3,
Y = 4,
Z = 5 ;
X = 6,
Y = 8,
Z = 10 ;
X = 5,
Y = 12,
Z = 13 ;
X = 9,
Y = 12,
Z = 15 ;

关于prolog - 生成毕达哥拉斯三元组到无穷大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52967915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com