【问题标题】:Programming the Quadratic Formula in Prolog在 Prolog 中编写二次公式
【发布时间】:2017-09-17 21:35:59
【问题描述】:

首先,我看到今天早些时候有人问了同样的问题,我决定自己试一试(但遇到了麻烦)。我希望我为此创建了一个新问题没关系!

我正在尝试制作一个解决二次公式 X = ​(​​−b±√​b​2​​−4ac)​/2a 的 prolog 程序。实现的谓词 quadratic([A,B,C], [Result]) 将 a、b 和 c 的列表作为第一个参数,将结果列表作为第二个参数。然而,这些清单给我带来了麻烦;我写了这段代码:

quadratic([A,B,C], [X]):-
  underRoot([A,B,C], UnderRootResult),
    UnderRootResult<0,
      X is 0.
quadratic([A,B,C], [X]):-
  underRoot([A,B,C], UnderRootResult),
    UnderRootResult=:=0,
      X is -B/2*A.
quadratic([A,B,C], [X]):-
  underRoot([A,B,C], UnderRootResult),
    UnderRootResult>0,
      X is -B - sqrt(UnderRootResult)/2*A,
      X is -B + sqrt(UnderRootResult)/2*A.

(这可能是错误的,所以请提前原谅) 运行它会给我 underRoot/2 的未定义过程错误。我真的不明白为什么会这样。我觉得我对如何编程有了大致的了解,但我犯了很多新手错误。不过,我似乎无法找出问题所在,因此我将不胜感激!

编辑:另外,如果我被允许同时问两个问题,如果列表中 >0 作为一个结果,我将如何获得两个 X?

【问题讨论】:

  • 谓词以小写开头,所以UnderRoot可能是错的?
  • 我不敢相信。很抱歉犯了那个错误。
  • 你可以写成 X is -B - sqrt(UnderRootResult)/(2*A)Y is -B + sqrt(UnderRootResult)/(2* A) 然后你写 L = [X,Y]。

标签: prolog quadratic


【解决方案1】:

这里有很多东西。首先,通常正文中的所有调用都放在同一列,但这并不是真正的错误。

此外,我没有找到 underRoot/2 谓词。我们可以像这样实现:

underRoot([A,B,C],X) :-
    X is B*B-4*A*C.

此外,您总是将[X] 放在子句的开头。但如果UnderRoot 小于零,则没有解决方案,因此列表应为[]。此外,如果UnderRoot &gt; 0,则有两种解决方案,因此解决方案应为[X1,X2]

最后如果你写-B/2*A,它会被解释为:(-B/2)*A,所以你将乘以A。所以你需要使用-B/(2*A)

所以这给我们带来了以下建议:

quadratic(L, []) :-
    underRoot(L, U),
    U < 0.
quadratic([A,B,C], [X]) :-
    underRoot([A,B,C],0),
    X is -B/(2*A).
quadratic([A,B,C], [X1, X2]) :-
    underRoot([A,B,C],U) :-
    SU is sqrt(U),
    X1 is (-B-SU)/(2*A),
    X2 is (-B+SU)/(2*A).

【讨论】:

  • 是的,我注意到我在这里写下的代码中犯了一些错误,并自己解决了。我只在第二个子句上遇到了麻烦,它以某种方式给了我错误的答案,所以看到你的代码真的很有帮助,而且它也是一种更有效的写下来的方法。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多