【问题标题】:Right-angled triangle prolog construction直角三角形序言构造
【发布时间】:2015-02-16 11:51:06
【问题描述】:

我要问一个问题,哪些答案正在解决这个任务:

从长度为 1 到 6 的整数的六段中选择三个边可以构成哪些直角三角形

所以,我认为这是必不可少的:

between(1,6,X),
between(1,6,Y),
between(1,6,Z),

然后我们要确保它符合毕达哥拉斯的说法,所以我在尝试这个,添加到上面的句子中:

(X^2 = Y^2 + Z^2 ; 
Y^2 = X^2 + Z^2 ; 
Z^2 = X^2 + Y^2)

我也一直在尝试用X*X 替换X^2,但它每次都返回false。这是为什么呢?

据我了解,我需要它像这样工作: 从范围 1-6 中选择三个边,并确保它们符合毕达哥拉斯的陈述。 (这里也需要三角视差吗?我的意思是X>Y+Z,Y>X+Z,Z>X+Y

【问题讨论】:

  • 尝试=:= 而不是=。此外,您不需要所有这 3 个表达式,因为它们只会提供冗余信息。你真的关心区分 3,4,55,3,4 吗?
  • 嗯,这实际上是你提到的好事。谢谢。我将来会需要这个,但在这里 - 不,我不需要。顺便说一句,这个指定任务 5,3,45,4,3 的唯一可能答案是什么?你提议=:=,因为它是一个比较条件,对吧?
  • 查看 prolog 手册中有关不同比较器等的信息。它们的含义和作用各不相同。 =:=/2 专门评估两边的算术表达式并检查结果是否相等。 =/2 不是等式运算符;它执行prolog unification。了解其中的区别很重要。在您的示例中,将所有结果限制为最大6,然后3,4,5 的排列是直角三角形的唯一正整数解。
  • @nobodynoone 你可以添加类似Y >= Z的内容。
  • 顺便说一下,标签pascals-triangle 在这里不合适,因为这个问题与帕斯卡三角形没有直接关系。见en.wikipedia.org/wiki/Pascal%27s_triangle

标签: prolog geometry pythagorean


【解决方案1】:

查看有关不同比较器等的序言手册。它们的含义和做不同的事情。 =:=/2 专门评估两边的算术表达式并检查结果是否相等。 =/2 不是相等运算符;它执行序言统一。了解其中的区别很重要。在您的示例中,将所有结果限制为最大6,然后3,4,5 的排列是直角三角形的唯一正整数解。

?- between(1,6,X), between(1,6,Y), between(1,6,Z), Z^2 =:= X^2 + Y^2.
X = 3,
Y = 4,
Z = 5 ;
X = 4,
Y = 3,
Z = 5 ;
false.

【讨论】:

  • 您可以添加X <= Y 以防止出现排列。
  • @SQB 是的,好主意。我不确定 OP 在这方面的具体要求是什么。
猜你喜欢
  • 1970-01-01
  • 2011-04-22
  • 2020-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多