在Prolog中解决一组方程

7
假设我有一个数X,我想解方程组Y+Z=X,Z*Y=1。
现在,它的解为Y=1/Z和Z=(sqrt(X*X-4)+X)/2或(X-(sqrt(X*X-4)))/2。
所以我可以在Prolog中写成:
solve(X,Y,Z):- Y is (sqrt(X*X-4)+X)/2, Z is 1/Y.
solve(X,Y,Z):- Y is (X-(sqrt(X*X-4)))/2,Z is 1/Y.

这个方法是有效的。

但是

它需要我在之前进行很多准备工作,基本上是先解决问题,然后只是要求Prolog对答案进行评估。

是否有一种方法可以在不事先解决X的情况下获得Z和Y?

我不能只写一些

solve(X,Y,Z):- X is Y+Z, Z is 1/Y.

由于实例化错误导致的。

https://dev59.com/tGYr5IYBdhLWcg3waJn7 - Erik Kaplun
1个回答

3

我认为你需要一个计算机代数系统(CAS)来符号性地解决这个问题,就像你“手动”解决一样。这种软件既不容易找到,也不容易构建。

如果你可以采用务实的方法,那么使用库(clprq)可能会有所帮助:

:- [library(clpr)].
solve(X,Y,Z) :- {Y+Z=X, Z*Y=1}.

产生

?- solve(3,Y,Z).
{Z=3.0-Y, -1.0+Z*Y=0.0},
{-1.0+Z*Y=0.0},
{-1.0+Z*Y=0.0}.

这有意义吗?


1
说实话,不是很行,但我想我可以写一个二次多项式求解器然后使用它。不过还是谢谢。 - Valtteri
为什么很难找到这样的软件?它不存在吗?它对于Prolog不存在吗? - Erik Kaplun
1
@ErikAllik:这是一个相当困难的话题,我不知道从哪里下载CAS的网站。至少在一本书中(谷歌搜索Sterling-Shapiro的《Prolog艺术》),CAS是一个章节的主题,也许作为起点实现可能会有所帮助... - CapelliC
1
@ErikAllik:嗯,我没有搜索得够仔细,我找到了PRESS进行下载 - CapelliC
1
PRESS的更好下载链接是https://github.com/maths/PRESS(来自https://dev59.com/tGYr5IYBdhLWcg3waJn7) - Erik Kaplun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接