feedback(_Concept) :-
	( user_level(_User_level) ->
		feedback(_Concept, _User_level)
	;
		feedback(_Concept, novice)
	)
	; true.

tell_usr(_Concept, _Value) :-
	to_bb(user_dialog, tell_user,_Concept, _Value).
ask_usr(_Concept) :-
	to_bb(user_dialog, ask_user,_Concept).
ask_usr(_Concept, _Default) :-
	to_bb(user_dialog, ask_user,_Concept, _Default).
unask_usr(_Concept) :-
	to_bb(user_dialog, unask_user,_Concept).
focus_usr(_Concept) :-
	to_bb(user_dialog, focus_user,_Concept).
unfocus_usr(_Concept) :-
	to_bb(user_dialog, unfocus_user,_Concept).
defocus_usr(_Concept) :-
	to_bb(user_dialog, defocus_user,_Concept).
offer_usr(_Concept, _Values) :-
	to_bb(user_dialog, offer_user, _Concept, _Values).
suggest_usr(_Concept, _Value) :-
	to_bb(user_dialog, suggest_user, _Concept, _Value).
new_dlg(_Handler, _Args) :-
	to_bb(user_dialog, new_dialog, _Handler, _Args).

to_bb(_A, _B, _C, _D, _E) :-	% eg u_cpt concept keys args who_set
	to_bb(_A), csep,
	to_bb(_B, _C, _D, _E).
to_bb(_A, _B, _C, _D) :-	% eg user_dialog tell_user concept value
	to_bb(_A), csep,
	to_bb(_B, _C, _D).
to_bb(_A, _B, _C) :-		% eg user_dialog ask_user cpt
	to_bb(_A), csep,	% or notify_me area id_string
	to_bb(_B, _C).
to_bb(_A, _B) :-		% eg mk_area area
	to_bb(_A), csep,
	to_bb(_B), nl, ttyflush.
to_bb([_Head]) :-
	writeline(_Head).
to_bb([_Head|_Tail]) :-
	to_bb(_Head), ksep,
	to_bb(_Tail).
to_bb([]).
to_bb(_Arg) :-
	write(_Arg).

chat_usr(['']):-				% text separator on its own
	chat_usr([]).
chat_usr(_Text):-
	write('user_dialog'), csep,
	write('chat_user'), csep,
	writetext(_Text).
writetext([_Head]) :-
	writeline(_Head), nl.
writetext([_Head|_Tail]) :-
	writeline(_Head), tsep,
	writetext(_Tail).
writetext([]) :-
	tsep, nl.
writetext(_Arg) :-
	write(_Arg), nl.
writeline([_Head|_Tail]) :-
	writeline(_Head),
	writeline(_Tail).
writeline([_Head]) :-
	writeline(_Head).
writeline([]).
writeline(_Arg) :-
	write(_Arg).

csep :-					% bb's concept separator
	write('	').			%% 	= \t
ksep :-					% bb's concept key separator
	write('	').			%% 	= \t
tsep :-					% bb's text separator
	write('\n').			%% 	= '\n'


uset(_Concept, _Value) :-		/* user set concept value */
	nonvar(_Concept),
	set(u_mdl, _Concept, user_set, nokey, _Value).	%%
uset(_Concept, _Keys, _Value) :-
	nonvar(_Concept), nonvar(_Keys),
	set(u_mdl, _Concept, user_set, _Keys, _Value).	%%
kset(_Concept, _Value) :-	    /*knowledge handler set concept value*/
	nonvar(_Concept),
	( known(_Concept, nokey, _Value, user_set)
	;	set(u_mdl, _Concept, kb_set, nokey, _Value)
	).
kset(_Concept, _Keys, _Value) :-
	nonvar(_Concept), nonvar(_Keys),
	( known(_Concept, user_set, _Keys, _Value)
	;	set(u_mdl, _Concept, _Keys, _Value, kb_set)
	).

set(_Area, _Concept, _Who_set, _Keys, _Value) :-
	_Old_Term =.. [_Area, _Concept, _, _Keys, _],  %%%% hold locally ??
	( retract(_Old_Term) ; true ),
	_Term =.. [_Area, _Concept, _Who_set, _Keys, _Value],
	assert(_Term),
	to_bb(_Area, _Concept, _Who_set, _Keys, _Value).



known(_Concept, _Value) :-
	nonvar(_Concept), var(_Value),
	query(u_mdl, _Concept, _, nokey, _Value).
known(_Concept, _Keys, _Value) :-
	nonvar(_Concept), nonvar(_Keys), var(_Value),
	query(u_mdl, _Concept, _, _Keys, _Value).
knownw(_Concept, _Who_set, _Value) :-
	nonvar(_Concept), var(_Value),
	query(u_mdl, _Concept, _Who_set, nokey, _Value).
knownw(_Concept, _Who_set, _Keys, _Value) :-
	nonvar(_Concept), nonvar(_Keys), var(_Value),
	query(u_mdl, _Concept, _Who_set, _Keys, _Value).
query(_Area, _Concept, _Who_set, _Keys, _Value) :-
	_Term =.. [_Area, _Concept, _Keys, _Value, _Who_set], % check locally
	_Term.
/*known(_Area, _Concept, _Who_set, _Keys, _Value) :-%%%% held locally for now
 *	write(query), write('	'),
 *	write(_Area), write('	'),
 *	to_bb(_Concept, '?', '?', '?'),
 *	read_ans(_Concept, _Who_set, _Keys, _Value),
 *	_Value \== '?'.
 */



quitrqst :-					/* user said quit */
	to_bb(quitrqst, kb-um),
	halt.
quitrqst(_) :-
	to_bb(quitrqst, kb-um),
	halt.
quitrqst(_,_) :-
	to_bb(quitrqst, kb-um),
	halt.

	
