用Prolog语言编制二次公式
首先,今天早些时候我看到有人问我同样的问题,我决定自己试一试(但遇到了麻烦)。我希望这是好的,我创造了一个新的问题,这 我正试图制作一个prolog程序来解决二次公式X=(−b±√B2.−4ac)/2a。实现的谓词quadratic([A,B,C],[Result])将A,B和C的列表作为第一个参数,将结果的列表作为第二个参数。然而,这些清单给我带来了麻烦;我写了这段代码:用Prolog语言编制二次公式,prolog,quadratic,Prolog,Quadratic,首先,今天早些时候我看到有人问我同样的问题,我决定自己试一试(但遇到了麻烦)。我希望这是好的,我创造了一个新的问题,这 我正试图制作一个prolog程序来解决二次公式X=(−b±√B2.−4ac)/2a。实现的谓词quadratic([A,B,C],[Result])将A,B和C的列表作为第一个参数,将结果的列表作为第二个参数。然而,这些清单给我带来了麻烦;我写了这段代码: quadratic([A,B,C], [X]):- underRoot([A,B,C], UnderR
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]。是的,我注意到我在这里写的代码中犯了一些错误,我自己解决了。我只在第二条中遇到了麻烦,它不知怎么地给了我错误的答案,所以看到你的代码真的很有帮助,这也是一种更有效的写下它的方法。谢谢!