/* PROCEDURES TO SUBSTITUTE NEW VARIABLE NAMES
   AND GENERATE NAMES FOR UNKNOWNS */


/* subst_first(Old,New,Old_Expr,New_Expr) substitutes New for
   the first occurence of Old in Old_Expr and returns the result
   in New_Expr */

subst_first(Old,New,Old,New) :- !.

subst_first(Old,New,Old_Expr,New_Expr) :-
   atomic(Old_Expr), !,
   fail.

subst_first(Old,New,[H|T],[NH|T]) :-
   subst_first(Old,New,H,NH), !.

subst_first(Old,New,[H|T],[H|NT]) :-
   subst_first(Old,New,T,NT), !.

subst_first(Old,New,[H|T],[H|T]) :-
   !, fail.

subst_first(Old,New,Old_Expr,New_Expr) :-
   Old_Expr=..[P|Args],
   subst_first(Old,New,Args,New_Args),
   New_Expr=..[P|New_Args].



/* constant(I,Max_Unknown,C) returns the Ith canonical constant in C,
   given the maximum unknown wanted in Max_Unknown */

constant(I,Max_Unknown,C) :-
   I =< Max_Unknown,
   unknown(I,C).

constant(I,Max_Unknown,true) :-
   I =:= Max_Unknown+1.

constant(I,Max_Unknown,false) :-
   I =:= Max_Unknown+2.

constant(I,Max_Unknown,Int) :-
   I > Max_Unknown+2,
   Int is I-Max_Unknown-3.



/* unknown(I,Name) returns a canonical name for the Ith unknown */

unknown(1,u).
unknown(2,v).
unknown(3,w).
unknown(4,x).
unknown(5,y).
unknown(6,z).

unknown(I,Name) :-
   I>6,
   J is I-6,
   concat(u,J,Name).
