【问题标题】:Prolog pythagorean tripletProlog 毕达哥拉斯三元组
【发布时间】:2021-06-09 19:54:10
【问题描述】:

我正在尝试使用 prolog 解决项目欧拉问题 9。我是 prolog 的 100% n00b,我现在只是想了解基础知识。

我正在尝试使用 findall 来获取所有加起来为 1000 的三元组,但我无法真正弄清楚语法。

我希望是这样的:

pythag_trip(A, B, C, D) :- D is (A * A) + (B * B) + (C * C).
one_thou_pythag(A, B, C) :- pythag_trip(A, B, C, 1000).
product_trip(A, B, C, D) :- D is A * B * C.
findall([A, B, C], one_thou_pythag(A, B, C) , Bag)).
writeln(Bag).

我知道这不起作用,因为它说 Bag 没有实例化。但是对于这门语言,我仍然有一些基本的不懂。

1:我什至可以这样做吗?一次有多个移动部件?我能找到所有满足条件的三元组吗?我需要像使用 clpfd 那样完全不同吗?

2:我放置 Bag 的最后一个参数应该是什么?

3:是否可以创建数据类型?我在想,如果我必须找到某种方法来自己生成所有可能性,那么创建一个三元组类型和一个运算来获得它们的毕达哥拉斯三元组总和可能会很好

基本上这些问题,然后,如果有人有提示,我可以使用一些指向正确的方向

【问题讨论】:

    标签: prolog clpfd pythagorean


    【解决方案1】:

    对不起,我不回答你的问题。在我看来,您尝试的不是类似 prolog 的方法。

    你应该试着从逻辑上解决它。

    所以从上到下做这个问题。 我们希望有 3 个总和为 1000 的数字。

    between(1,1000,A), between(A,1000,B), between(B,1000,C), C is 1000-A-B.
    

    在这种情况下,我们将对它们进行排序并且我们不会进行排列。

    所以让我们更进一步。我们希望它们是 pythagorem 三元组。

    between(1,1000,A), between(A,1000,B), between(B,1000,C), C is 1000-A-B, is_triplet(A,B,C).
    

    但是我们没有is_triplet/3 谓词,所以让我们创建它

    is_triplet(A,B,C) :- D is C*C - A*A -B*B, D=0.
    

    实际上就是这样。

    让我们总结一下

    is_triple(A, B, C) :- D is C*C - A*A - B*B, D = 0.
    triplet(A,B,C) :- between(1,1000,A), between(A,1000,B), C is 1000-A-B, between(B,1000,C), C is 1000-A-B, is_triple(A,B,C). 
    

    当您拨打triplet(A,B,C) 时,您应该会得到答复。

    请注意一件事,最后我将C is 1000-A-B 替换为between(B,1000,C)。它使程序变得更快,试着想想为什么。

    【讨论】:

    • 更具可读性:is_triplet(A,B,C) :- A*A + B*B =:= C*C.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    • 2016-01-08
    • 1970-01-01
    相关资源
    最近更新 更多