%      Production system KORE/IE (version 12.48)
%
%          (C)1992 Institute for New Generation Computer Technology
%                          (Read COPYRIGHT for detailed information)
%
%      1992.7 Check and refine every programs 
%                             for IFS (ICOT Free Software) release.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% DEFINE_STRATEGY %%%%%%%%%%%%%%%%%%%%%%%% modified 3/11 %%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%% DEFINE_STRATEGY
(define_strategy mea := _) :-
	write('System Strategy ''mea'' has be defined by'),
	write('''select latest instantiation by comparing first time tag'''),
	ttynl,
	!.
(define_strategy lex := _) :-
	write('System Strategy ''lex'' has be defined by'),
	write('''select latest instantiation'''),
	ttynl,
	!.
(define_strategy Strategy_Name := select X instantiation by
			comparing Position time tag and Z constraints) :-
	define_strategy_check_1(X,XX),
	define_strategy_check_2(Position,POSITION),
	define_strategy_check_3(Z,ZZ),
	(retract(user_define_strategy(Strategy_Name,_,_));
	 true),
	asserta(
	    user_define_strategy(Strategy_Name,
					[XX,POSITION,ZZ],
					(select X instantiation by 
						comparing Position time tag
							and
						Z constraints))
		),
	!.
(define_strategy S := select X instantiation with Z constraints) :-
	define_strategy_check_1(X,XX),
	define_strategy_check_3(Z,ZZ),
	(retract(user_define_strategy(S,_,_));
	 true),
	asserta(
	    user_define_strategy(S,[XX,position,ZZ],
					(select X instantiation by
							Z constraints))
		),
	!.
(define_strategy S := select X instantiation by comparing Y time tag) :-
	define_strategy_check_1(X,XX),
	define_strategy_check_2(Y,YY),
	(retract(user_define_strategy(S,_,_));
	 true),
	asserta(
	    user_define_strategy(S,[XX,YY,_],
					(select X instantiation by
							comparing Y time tag))
		),
	!.
(define_strategy S := select X) :-
	define_strategy_check_1(X,XX),
	(retract(user_define_strategy(S,_));
	 true),
	asserta(user_define_strategy(S,[XX,_,_],(select X))),
	!.

%%%%% define_strategy_check_1
define_strategy_check_1(oldest, oldest).
define_strategy_check_1(latest, latest).
define_strategy_check_1(Option,latest) :-
	write('Unknown Option '),
	write(Option),
	write(' ...'),
	ttynl,
	write('System selected the Option ''latest''.'),
	ttynl,
	write('Known Options are '),
	ttynl,
	write('    ''latest'' and ''oldest'' .'),
	ttynl,
	!.

%%%%% define_strategy_check_2
define_strategy_check_2(first,1).
define_strategy_check_2(second,2).
define_strategy_check_2(third,3).
define_strategy_check_2(fourth,4).
define_strategy_check_2(fifth,5).
define_strategy_check_2(N,N) :-
	integer(N),
	N > 0,
	N < 6.
define_strategy_check_2(Option,1) :-
	write('Unknown Option '),
	write(Option),
	write(' ...'),
	nl,
	write('System selected the Option ''first''.'),
	nl,
	write('Known Options are '),
	nl,
	write('     ''first'', ''second'', ''third'', ''fourth'''),
	write('''fifth'' and also integer 1,2,3,4,5.'),
	nl,
	!.

%%%%% define_strategy_check_3
define_strategy_check_3(less, less).
define_strategy_check_3(more, more).
define_strategy_check_3(Option, more) :-
	write('Unknown Option '),
	write(Option),
	write(' ...'),
	ttynl,
	write('System selected the Option ''more''.'),
	ttynl,
	write('Known Options are '),
	ttynl,
	write('     ''more'' and ''less'' .'),
	ttynl,
	!.

%%%%% STRATEGY/1
strategy(Rule_Base) :-
	strategy_rec(Rule_Base,S,S),
	display('Current Strategy --> '),
	display(S),
	ttynl,
	!.
strategy(Rule_Base) :-
	strategy_rec(Rule_Base,S,_),
	user_define_strategy(S,_,BODY),
	display('Current Strategy --> '),
	display(S),
	ttynl,
	display('   Defined by '' '),
	display(BODY),
	display(' '''),
	ttynl,
	!.

%%%%% STRATEGY/2
strategy(Rule_Base,S) :-
	(S = lex;
	 S = mea),
	(retract(strategy_rec(Rule_Base,_,_));
	 true),
	asserta(strategy_rec(Rule_Base,S,S)).
strategy(Rule_Base,User_Defined) :-
	user_define_strategy(User_Defined,Strategy,_),
	(retract(strategy_rec(Rule_Base,_,_));
	 true),
	asserta(strategy_rec(Rule_Base,User_Defined,Strategy)).
strategy(_,_) :-
	display(''),
	ttynl,
	display('If you want to define your strategy, use ''define_strategy'''),
	ttynl,
	!.
