%% Knowledge base for air flow input control
%% Last change: 19/06/91

%%%% Initialization predicate -------------------------------------
u_airflow(initialize):-
	curr_zone(_Zone_number),!,
	load_z_name(_Zone_number),
	refresh_u_values(_Zone_number),
	feedback(u_airflow_sel).

%%%% Refresh predicates --------------------------------------------
u_airflow(refresh):-
	curr_zone(_Zone_number),!,
	load_z_name(_Zone_number),
	refresh_u_values(_Zone_number).

refresh_u_values(_Zone_number):-
	day_type(_Day_type),!,
	tell_usr(u_day_type,_Day_type),
	refresh_control(_Zone_number),
	refresh_u_day_values(_Zone_number,_Day_type).

refresh_u_day_values(_Zone_number,_Day_type):-
	repeat, gen_integer(_N,1), (
	refresh_u_start(_Zone_number,_Day_type,_N),
	refresh_u_end(_Zone_number,_Day_type,_N),
	refresh_infiltration(_Zone_number,_Day_type,_N),
	refresh_zone_coupled(_Zone_number,_Day_type,_N),
	refresh_couple_index(_Zone_number,_Day_type,_N)
	), _N = 4,!.

refresh_control(_Zone_number):-
	known(u_control_type,_Zone_number,_Number),
	control_type_string(_Number,_Control_type),!,
	u_control_type(_Control_type),
	tell_usr(u_control_type,_Control_type)
	;
	u_control_type(no),
	tell_usr(u_control_type,no).

refresh_control_values(_Zone_number):-
	refreshc(upper_control_limit,_Zone_number),
	refreshc(lower_control_limit,_Zone_number),
	refreshc(upper_infiltration,_Zone_number),
	refreshc(lower_infiltration,_Zone_number),
	refreshc(upper_zone_coupled,_Zone_number),
	refreshc(lower_zone_coupled,_Zone_number),
	refresh_upper_couple_index(_Zone_number),
	refresh_lower_couple_index(_Zone_number).


%%%% Control predicates -------------------------------------------
%% Daytype
u_day_type(_Day_type):-
	asserta(day_type(_Day_type)),
	curr_zone(_Zone_number),
	refresh_u_day_values(_Zone_number,_Day_type).

u_day_type(_):-
	day_type(_Day_type),
	tell_usr(u_day_type,_Day_type).


%%%% Input predicates ---------------------------------------------
%% Air flow values
'u_start$'(_N,_Time):-
	curr_zone(_Zone_number),
	day_type(_Day_type),
	verify_time(['u_start$',_N],_Time),
	num_lines(num_a,[_Zone_number,_Day_type],_N),
	uset(u_start,[_Zone_number,_Day_type,_N],_Time).

refresh_u_start(_Zone_number,_Day_type,_N):-
	known( u_start,[_Zone_number,_Day_type,_N],_Time),!,
	ask_usr(['u_start$',_N],_Time);
	ask_usr(['u_start$',_N], ' ').

'u_end$'(_N,_Time):-
	curr_zone(_Zone_number),
	day_type(_Day_type),
	verify_time(['u_end$',_N],_Time),
	num_lines(num_a,[_Zone_number,_Day_type],_N),
	uset(u_end,[_Zone_number,_Day_type,_N],_Time).

refresh_u_end(_Zone_number,_Day_type,_N):-
	known(u_end,[_Zone_number,_Day_type,_N],_Time),!,
	ask_usr(['u_end$',_N],_Time);
	ask_usr(['u_end$',_N], ' ').

'infiltration$'(_N,_Value):-
	curr_zone(_Zone_number),
	day_type(_Day_type),
	num_lines(num_a,[_Zone_number,_Day_type],_N),
	uset(infiltration,[_Zone_number,_Day_type,_N],_Value).

refresh_infiltration(_Zone_number,_Day_type,_N):-
	known(infiltration,[_Zone_number,_Day_type,_N],_Value),!,
	ask_usr(['infiltration$',_N],_Value);
	ask_usr(['infiltration$',_N], ' ').

'zone_coupled$'(_N,_Value):-
	curr_zone(_Zone_number),
	day_type(_Day_type),
	num_lines(num_a,[_Zone_number,_Day_type],_N),
	uset(zone_coupled,[_Zone_number,_Day_type,_N],_Value),
	( _Value =:= 0 ,
	  ask_usr(['couple_index$',_N], '0'),
	  tell_usr(['couple_type$',_N], temp),
	  uset(couple_index_d1,[_Zone_number,_Day_type,_N], 0),
	  uset(couple_index_d2,[_Zone_number,_Day_type,_N], 0);
	  true
	).

refresh_zone_coupled(_Zone_number,_Day_type,_N):-
	known(zone_coupled,[_Zone_number,_Day_type,_N],_Value),!,
	ask_usr(['zone_coupled$',_N],_Value);
 	ask_usr(['zone_coupled$',_N], ' ').

'couple_type$'(_N,_Value):-
	curr_zone(_Zone_number),
	day_type(_Day_type),
	asserta(couple_type(_Zone_number,_Day_type,_N,_Value)).

'couple_index$'(_N,_Value):-
	curr_zone(_Zone_number),
	day_type(_Day_type),
	(  couple_type(_Zone_number,_Day_type,_N,_Type)
	  ;
	   asserta(couple_type(_Zone_number,_Day_type,_N,temp)),
	   _Type = temp
	),
	tell_usr(['couple_type$',_N], _Type),
	( _Type == temp ,
	   uset(couple_index_d1,[_Zone_number,_Day_type,_N], 0),
	   uset(couple_index_d2,[_Zone_number,_Day_type,_N],_Value);
	   uset(couple_index_d1,[_Zone_number,_Day_type,_N],_Value),
	   uset(couple_index_d2,[_Zone_number,_Day_type,_N], 0)
	).

refresh_couple_index(_Zone_number,_Day_type,_N):-
	known(couple_index_d1,[_Zone_number,_Day_type,_N],_D1),
	known(couple_index_d2,[_Zone_number,_Day_type,_N],_D2),!,
	(
	  _D1 =:= 0 ->
	  tell_usr(['couple_type$',_N], temp),
	  ask_usr(['couple_index$',_N], _D2)
	  ;
	  tell_usr(['couple_type$',_N], zone),
	  ask_usr(['couple_index$',_N], _D1)
	)
	;
	tell_usr(['couple_type$',_N], temp),
	ask_usr(['couple_index$',_N], ' ').


%% Airflow conrol --------------------------------------------------
u_control_type(no):-
	curr_zone(_Zone_number),
	uset(u_control_type,_Zone_number,0),
	unask_usr(u_control).

u_control_type(_Control_type):-
	curr_zone(_Zone_number),
	control_type_string(_Number,_Control_type),
	uset(u_control_type,_Zone_number,_Number),
	ask_usr(u_control),
	refresh_control_values(_Zone_number).


%% Control values --------------------------------------------------
upper_control_limit(_Upper_limit):-
	curr_zone(_Zone_number),
	uset(upper_control_limit,_Zone_number,_Upper_limit).

lower_control_limit(_Lower_limit):-
	curr_zone(_Zone_number),
	uset(lower_control_limit,_Zone_number,_Lower_limit).

upper_infiltration(_Upper_infiltration):-
	curr_zone(_Zone_number),
	uset(upper_infiltration,_Zone_number,_Upper_infiltration).

lower_infiltration(_Lower_infiltration):-
	curr_zone(_Zone_number),
	uset(lower_infiltration,_Zone_number,_Lower_infiltration).

upper_zone_coupled(_Upper_zone_coupled):-
	curr_zone(_Zone_number),
	uset(upper_zone_coupled,_Zone_number,_Upper_zone_coupled),
	( _Upper_zone_coupled > 0;
	  uset(upper_couple_index_d1,_Zone_number, 0),
	  uset(upper_couple_index_d2,_Zone_number, 0),
	  tell_usr(upper_couple_type, temp),
	  ask_usr(upper_couple_index, 0)
	).

lower_zone_coupled(_Lower_zone_coupled):-
	curr_zone(_Zone_number),
	uset(lower_zone_coupled,_Zone_number,_Lower_zone_coupled),
	( _Lower_zone_coupled > 0;
	  uset(lower_couple_index_d1,_Zone_number, 0),
	  uset(lower_couple_index_d2,_Zone_number, 0),
	  tell_usr(lower_couple_type, temp),
	  ask_usr(lower_couple_index, 0)
	).

upper_couple_type(_Value):-
	curr_zone(_Zone_number),
	asserta(upper_couple_type(_Zone_number,_Value)).

lower_couple_type(_Value):-
	curr_zone(_Zone_number),
	asserta(lower_couple_type(_Zone_number,_Value)).

upper_couple_index(_Value):-
	curr_zone(_Zone_number),
 	(  upper_couple_type(_Zone_number,_Type)
	  ;
	   asserta(upper_couple_type(_Zone_number, temp)),
	   _Type = temp
	),
	tell_usr(upper_couple_index, _Type),
	( _Type == temp ,
	   uset(upper_couple_index_d1,_Zone_number, 0),
	   uset(upper_couple_index_d2,_Zone_number,_Value);
	   uset(upper_couple_index_d1,_Zone_number,_Value),
	   uset(upper_couple_index_d2,_Zone_number, 0)
	).

lower_couple_index(_Value):-
	curr_zone(_Zone_number),
 	(  lower_couple_type(_Zone_number,_Type)
	  ;
	   asserta(lower_couple_type(_Zone_number, temp)),
	   _Type = temp
	),
	tell_usr(lower_couple_index, _Type),
	( _Type == temp ,
	   uset(lower_couple_index_d1,_Zone_number, 0),
	   uset(lower_couple_index_d2,_Zone_number,_Value);
	   uset(lower_couple_index_d1,_Zone_number,_Value),
	   uset(lower_couple_index_d2,_Zone_number, 0)
	).

refresh_lower_couple_index(_Zone_number):-
	known(lower_couple_index_d1,_Zone_number,_D1),
	known(lower_couple_index_d2,_Zone_number,_D2),!,
	(
	  _D1 =:= 0 ->
	  tell_usr(lower_couple_type, temp),
	  ask_usr(lower_couple_index, _D2)
	  ;
	  tell_usr(lower_couple_type, zone),
	  ask_usr(lower_couple_index, _D1)
	).

refresh_lower_couple_index(_Zone_number):-
	tell_usr(lower_couple_type, temp),
	ask_usr(lower_couple_index, ' ').

refresh_upper_couple_index(_Zone_number):-
	known(upper_couple_index_d1,_Zone_number,_D1),
	known(upper_couple_index_d2,_Zone_number,_D2),!,
	(
	  _D1 =:= 0 ->
	  tell_usr(upper_couple_type, temp),
	  ask_usr(upper_couple_index, _D2)
	  ;
	  tell_usr(upper_couple_type, zone),
	  ask_usr(upper_couple_index, _D1)
	).

refresh_upper_couple_index(_Zone_number):-
	tell_usr(upper_couple_type, temp),
	ask_usr(upper_couple_index, ' ').


%%%% Service ------------------------------------------------------

%% Zone name
zone_name(_Zone_name) :-
	curr_zone(_Zone_number),
	asserta(z_name(_Zone_number,_Zone_name)),
	uset(z_name,_Zone_number,_Zone_name).

load_z_name(_Zone_number):-
	z_name(_Zone_number,_Zname),!,
	tell_usr(zone_name, _Zname);
	tell_usr(zone_name, ' ').

%% Line counter predicate
num_lines(_Concept,_Key,_N):-
	known(_Concept,_Key,_N_old),!,
	( _N_old < _N,
	  uset(_Concept,_Key,_N);
	  true );
	uset(_Concept,_Key,_N).

%% Verification predicates
verify_time(_Concept,_Time):-
	_Time >= 0,
	_Time =< 24;
	  (
	  _Time < 0,
	  ask_usr(_Concept, 0),
	  feedback(time_lt_0)
	  ;
	  ask_usr(_Concept, 24),
	  feedback(time_gt_24)
	  ),!,
	  fail.


%%%% Rephrasing terms --------------------------------------------
control_type_string(0,no).
control_type_string(1,zone_air).
control_type_string(2,inc_air).
control_type_string(3,ext_air).
control_type_string(4,wind).


%%%% Feedback ----------------------------------------------------

feedback(u_airflow_sel, novice):-
	chat_usr([
		'This button switches the focus of discussion to',
		'the air flow concern of the occupancy  patterns',
		'of the building.    Two subsidary forms will be',
		'offered to describe the airflow and the control',
		'of the airflow.',
		'']).

feedback(u_airflow_sel, expert):-
	chat_usr([
		'Airflow operation of considered zones.',
		'']).

feedback(time_lt_0, _):-
	chat_usr([
		'',
		'A time input must not be less than 0.',
		'']).

feedback(time_gt_24, _):-
	chat_usr([
		'',
		'A time input must not be greater than 24.',
		'']).
