
% ------------------------------------------------------
% queries dealing with the polynomial
%     AX^2 + BX + C = R
% where values are given for at least 4 out of A,B,C,R,X
% ------------------------------------------------------
% usage: evalquad(A,B,C,X,R).
% ------------------------------------------------------

% if X is 0 and C=R, any values just have to be numbers
% -----------------------------------------------------
evalquad(A,B,C,0,C) :- number(A), number(B), number(C).
evalquad(any,B,C,0,C) :- number(B), number(C).
evalquad(A,any,C,0,C) :- number(A), number(C).
evalquad(any,any,C,0,C) :- number(C).


% evaluate the polynomial given the A,B,C,X values
% ------------------------------------------------
evalquad(A,B,C,X,R) :- number(A), number(B), number(C),
                       number(X), Res is A*X*X + B*X + C, R = Res.


% solve for A given the other 4 values
% ------------------------------------
evalquad(A,B,C,X,R) :- var(A), number(B), number(C), number(X), number(R),
   A is (R - (B*X + C)) / (X^2).


% solve for B given the other 4 values
% ------------------------------------
evalquad(A,B,C,X,R) :- var(B), number(A), number(C), number(X), number(R),
   B is (R - (A*X*X + C)) / X.


% solve for C given the other 4 values
% ------------------------------------
evalquad(A,B,C,X,R) :- var(C), number(A), number(B), number(X), number(R),
   C is R - (A*X*X + B*X).


% solve for X given the other 4 values
% ------------------------------------

% case 1: A,B are both 0, as long as C==R then X could be anything
evalquad(A,B,C,any,C) :- number(A), number(B), number(C),
   format("case 1~n").

% case 2: A is 0, B is non-zero, so X = (C-R)/B
evalquad(A,B,C,X,R) :- var(X), number(A), number(B), number(C), number(R),
   A =:= 0, B =\= 0,
   format("case 2~n"),
   X is ((C - R) / B).

% case 3: A is non-zero, B^2 < 4A(C-R), so X is complex
evalquad(A,B,C,complex,R) :- number(A), number(B), number(C),
   number(R), A =\= 0,
   format("case 3~n"),
   ((B^2) < (4*A*(C-R))).

% case 4: A is non-zero, B^2 == 4A(C-R), so X is -B/(2A)
evalquad(A,B,C,X,R) :- var(X), number(A), number(B), number(C),
   number(R), A =\= 0, ((B^2) =:= (4*A*(C-R))),
   format("case 4~n"),
   X is ((-B)/(2*A)).

% case 5a: A is non-zero, B^2 > 4A(C-R), give the first root
evalquad(A,B,C,X,R) :- var(X), number(A), number(B), number(C),
   number(R), A =\= 0, (B^2) > (4*A*(C-R)),
   format("case 5a~n"),
   X is (((-B) + sqrt((B^2) - (4*A*(C-R)))) / (2*A)).

% case 5b: A is non-zero, B^2 > 4A(C-R), give the second root
evalquad(A,B,C,X,R) :- var(X), number(A), number(B), number(C),
   number(R), A =\= 0, (B^2) > (4*A*(C-R)),
   format("case 5b~n"),
   X is (((-B) - sqrt((B^2) - (4*A*(C-R)))) / (2*A)).

