求解Prolog中的方程组

Val*_*eri 5 prolog constraint-programming equation-solving

假设我有一个数字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.
Run Code Online (Sandbox Code Playgroud)

这有效.

它需要我的许多初步工作,基本上事先解决它,只是要求Prolog评估答案.

有没有办法可以获得Z和Y,而不事先解决X?

我不能只写像

solve(X,Y,Z):- X is Y+Z, Z is 1/Y.
Run Code Online (Sandbox Code Playgroud)

因为实例化错误.

Cap*_*liC 3

我认为你需要一个 CAS,来象征性地解决系统问题,就像你“手工”所做的那样。这样的软件既不容易找到,也不容易构建。

如果务实的方法可以为您做到这一点,库(clprq)可以帮助您:

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

产量

?- 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}.
Run Code Online (Sandbox Code Playgroud)

这有道理吗?