假设我有一个数字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)
因为实例化错误.
我已经编写了一个用类似术语来解决方程的代码(例如: - x ^ 2 + 5*x + 6 = 0).这里'x'有两个值.我可以输入';'来取两个值.但是当我立刻运行程序时,我需要得到所有可能的答案.在prolog中有可能吗?
我想找到argmax(x,y,z)-1/2(20x ^ 2 + 32xy + 16y ^ 2)+ 2x + 2y.
受制于:x> = 0,y> = 0,z> = 0且-x-y + z = 0.
我知道偏导数设置为0是:
-20x-16y + 2 = 0和-16x-16y + 2 = 0
所以我们可以得x = 0和y = 1/8,z = 1/8.
我如何在Swi-prolog中做到这一点?我看到有用于线性求解的库单形,但这是一个二次问题,但偏导数不是.(我有一点困惑!)
这就是我所拥有的:
:- use_module(library(simplex)).
my_constraints(S):-
gen_state(S0),
constraint([-20*x, -16*y] = 0, S0, S1),
constraint([-16*x,-16*y] = 0, S1,S2),
constraint([x] >= 0,S2,S3),
constraint([y] >= 0,S3,S4),
constraint([z] >= 0,S4,S5),
constraint([-x-y+z] = 0,S5,S).
?- my_constraints(S), variable_value(S,x,Val1),variable_value(S,y,Val2).
false.
Run Code Online (Sandbox Code Playgroud)