Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Prolog语言编制二次公式_Prolog_Quadratic - Fatal编程技术网

用Prolog语言编制二次公式

用Prolog语言编制二次公式,prolog,quadratic,Prolog,Quadratic,首先,今天早些时候我看到有人问我同样的问题,我决定自己试一试(但遇到了麻烦)。我希望这是好的,我创造了一个新的问题,这 我正试图制作一个prolog程序来解决二次公式X=​(​​−b±√​B​2.​​−4ac)​/2a。实现的谓词quadratic([A,B,C],[Result])将A,B和C的列表作为第一个参数,将结果的列表作为第二个参数。然而,这些清单给我带来了麻烦;我写了这段代码: quadratic([A,B,C], [X]):- underRoot([A,B,C], UnderR

首先,今天早些时候我看到有人问我同样的问题,我决定自己试一试(但遇到了麻烦)。我希望这是好的,我创造了一个新的问题,这

我正试图制作一个prolog程序来解决二次公式X=​(​​−b±√​B​2.​​−4ac)​/2a。实现的谓词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.
二次([A,B,C],[X]):-
根下([A,B,C],根下结果),
下根结果0,
X是-B-sqrt(根下结果)/2*A,
X是-B+sqrt(根下结果)/2*A。
(这可能有很多错误,请先原谅我) 运行此命令将导致根目录/2下的未定义过程错误。我真的不明白为什么会这样。我觉得我对如何编程有了大致的想法,但是我犯了很多新手的错误。我可以;不过,我似乎无法找出问题所在,因此我将非常感谢您的帮助


编辑:另外,如果允许我一次问两个问题,那么在列表中出现>0的情况下,如何获得两个X作为一个结果?

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

此外,我没有在root/2谓词下找到
。我们可以实施一个类似于:

underRoot([A,B,C],X) :-
    X is B*B-4*A*C.
此外,您总是将
[X]
放在子句的开头。但如果根目录下的
小于零,则没有解决方案,因此列表应为
[]
。此外,在root>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).
二次(L,[]):- 根下(L,U), U<0。 二次([A,B,C],[X]):- 根下([A,B,C],0), X是-B/(2*A)。 二次([A,B,C],[X1,X2]):- 根下([A,B,C],U]:- SU为sqrt(U), X1为(-B-SU)/(2*A), X2是(-B+SU)/(2*A)。
谓词以小写开头,所以root下的
可能是错误的?我不敢相信这一点。很抱歉犯了这个错误。你可以写X是-B-sqrt(UnderRootResult)/(2*A),Y是-B+sqrt(UnderRootResult)/(2*A),然后你写L=[X,Y]。是的,我注意到我在这里写的代码中犯了一些错误,我自己解决了。我只在第二条中遇到了麻烦,它不知怎么地给了我错误的答案,所以看到你的代码真的很有帮助,这也是一种更有效的写下它的方法。谢谢!