/* frmeqn.
Form Auxiliary Equations for Cardan method
Alan Bundy 13.5.81 */

/* Cardan Method */
/*---------------*/

/* New polynomial method clause */
poly_method(Z,PolyBag,Ans) :-
	make_poly(Z,PolyBag,ZPoly),
	gen_term(PQTerm,NewUnks),
	subst_mesg(Z=PQTerm,ZPoly,Changed),
	gensym(cardan,Name),
	form_eqn(Name,NewUnks,Changed=0,Improved,Auxiliary),
	simsolve(Auxiliary & Improved, NewUnks, Ans1, part),
	sensible(Ans1),
	subst_mesg(Ans1,Z=PGTerm,Ans).


/* Generate a suitable change of unknown substitution */
gen_term(p+q,[p,q]).	/* Change this when other things work */

/* Is answer sensible? */
sensible(Ans) :-
	writef('sensible called on %t\n\n',[Ans]),
	Ans\==false.		/* add extra bits as they occur */

/* Form Auxiliary equations */
/*--------------------------*/

/* Suitable factor exists */
form_eqn(Name, NewUnks, Changed=0, Improved=0, Auxiliary=0) :-
	decomp(Changed, [+|Summands]),
	select(Distinguished,Summands,Rest),
	decomp(Distinguished,[*|Factors]),
	member(Auxiliary,Factors),
	is_new(Name,auxiliary,Auxiliary),
	test(NewUnks,Auxiliary),
	recomp(Improved,[+|Rest]),
	test(NewUnks,Improved).

/* Try Packing Summands */
form_eqn(Name, NewUnks, Changed=0, Improved, Auxiliary) :-
	decomp(Changed,[+|Summands]),
	select(X,Summands,Rest1), select(Y,Rest1,Rest),
	rewrite(packax,X+Y,Z),
	recomp(New,[+,Z|Rest]),
	is_new(Name,changed,New),
	form_eqn(Name,NewUnks,New=0,Improved,Auxiliary).

/* Try Unpacking Summands */
form_eqn(Name, NewUnks, Changed=0, Improved, Auxiliary) :-
	decomp(Changed,[+|Summands]),
	select(X,Summands,Rest),
	rewrite(unpackax,X,Y),
	decomp(Y,[+|Bag]),
	append(Bag,Rest,NewBag),
	recomp(New,[+|NewBag]),
	is_new(Name,changed,New),
	form_eqn(Name,NewUnks,New=0,Improved,Auxiliary).

/* Test that new equations are ok */
test([P|Qs], Eqn) :-
	contains(P,Eqn), !.

test([P|Qs], Eqn) :-
	test(Qs, Eqn), !.

/* New equation, really is new */
is_new(Name, Type, Eqn1) :- !,
	not (store(Name, Type, Eqn2) & match(Eqn1,Eqn2)),
	assert(store(Name, Type, Eqn1)),
	writef('Trying %t as new  %t equation\n',[Eqn1,Type]).
