/*************************************************************************

        name: resource_interfaces.pl 
 description: GoDiS-AOD Resource interface type definitions
     authors: Original code (June 2002) by Staffan Larsson (SL)
              Modifications by SL and David Hjelm (DH)
*************************************************************************/

/************************************************************************

HISTORY, started 031104

030321 (DH)
- modified dev_query relation to allow for parameters in device queries

031104
- modifed "depends" to include the "bind" and "raise" plan constructs [SL]

?????? (DH)
- modified "resolves" relation to include short answer to altq reg. props
- modified "combines" relation to include elliptical answer to altq reg. props

050302 (SL)
- added device relation dev_queryAll: gets all answers

050621 (SL)
- separated out domain help predicates to file "godis_semantics"

050630 (SL)
- Added a new predicate "hypernym" to the domain resource. In update-rules, revised integrateUsrRequest to allow intelligent interpretation of request htypernyms, i.e. requests that mean different things depending on the current topmost goal action. This required adding. Also, some changes were made to irrelevantFollowup and rejectAction to stop them from catching hypernym requests.

***************************************************************************/

:- module(resource_interfaces, [resource_of_type/2, resource_variable_of_type/2, is_resource_type/1, resource_operation/4, resource_relation/2, resource_operation_type/4, resource_relation_type/2, resource_function_type/3, resource_selector_type/3 ]).

:- multifile resource_of_type/2, resource_variable_of_type/2, is_resource_type/1, resource_operation/4, resource_relation/2, resource_operation_type/4, resource_relation_type/2, resource_function_type/3, resource_selector_type/3.

:- discontiguous resource_of_type/2, resource_variable_of_type/2, is_resource_type/1, resource_operation/4, resource_relation/2, resource_operation_type/4, resource_relation_type/2, resource_function_type/3, resource_selector_type/3.


:- use_module(library(lists)).

% dummy so resource_operation is defined somewhere

resource_operation( dummy, dummy, dummy, dummy ).


/*----------------------------------------------------------------------
     cfg
----------------------------------------------------------------------*/
is_resource_type( cfg ).
resource_variable_of_type( sr_grammar, cfg ).
resource_of_type( srg_tvgodis_svenska, cfg ).
resource_of_type( srg_tvgodis_svenska2, cfg ).
resource_of_type( _, cfg ).

resource_relation( rule, [Grammar, R ] ):-
	Grammar:rule(R).
resource_relation_type( rule, [cfg, cfg_production_rule] ).

resource_relation( rules, [Grammar, Rs] ):-
	Grammar:rules(Rs).
resource_relation_type( rules, [cfg, set(cfg_production_rule)] ).

resource_relation( start_symbol, [Grammar, S] ):-
	Grammar:start_symbol(S).

resource_relation_type( start_symbol, [cfg, cfg_nonterminal ]).




/*----------------------------------------------------------------------
     lexicon
----------------------------------------------------------------------*/

is_resource_type( lexicon ).

resource_variable_of_type( lexicon, lexicon ).

resource_of_type( lexicon_travel_english, lexicon ).
resource_of_type( lexicon_autoroute_english, lexicon ).
resource_of_type( lexicon_travel_svenska, lexicon ).
resource_of_type( lexicon_cellphone_svenska, lexicon ).
resource_of_type( lexicon_telephone_english, lexicon ).
resource_of_type( lexicon_vcr_english, lexicon ).
resource_of_type( lexicon_vcr_svenska, lexicon ).
resource_of_type( lexicon_telvcr_english, lexicon ).
resource_of_type( lexicon_telvcr_svenska, lexicon ).
resource_of_type( lexicon_telvcrlogin_english, lexicon ).
resource_of_type( lexicon_telvcrlogin_svenska, lexicon ).
resource_of_type( lexicon_agenda_english, lexicon ).
resource_of_type( _, lexicon ).

resource_relation( input_form, [Lexicon, Phrase, Move] ) :-
	Lexicon : input_form( Phrase, Move ).
resource_relation_type( input_form, [ lexicon, string, dmove ] ).

resource_relation( output_form, [Lexicon, Phrase, Move] ) :-
	Lexicon : output_form( Phrase, Move ).
resource_relation_type( output_form, [ lexicon, string, dmove ] ).

resource_relation( output_formcom, [Lexicon,Move,set(Com),Phrase] ):-
        Lexicon : output_form(Move,Com,Phrase).
resource_relation_type( output_form, [ lexicon,dmove,set(prop),string ] ).

resource_relation( yn_answer, [Lexicon, A] ) :-
	Lexicon : yn_answer( A ).
resource_relation_type( yn_answer, [ lexicon, answer ] ).

/*----------------------------------------------------------------------
     domain
----------------------------------------------------------------------*/

:- ensure_loaded(library(godis_semantics)).

is_resource_type( domain ).

resource_variable_of_type( domain, domain ).

resource_of_type( travel, domain ).
resource_of_type( autoroute, domain ).
resource_of_type( telephone, domain ).
resource_of_type( vcr, domain ).
resource_of_type( telvcr, domain ).
resource_of_type( telvcrlogin, domain ).
resource_of_type( tvgodis, domain ).
resource_of_type( agenda, domain).
resource_of_type( _, domain).

resource_relation( relevant, [Domain, Answer, Query ] ) :-
	relevant_answer( Query, Answer, Domain ).
resource_relation_type( relevant_answer, [domain, question, answer] ).

resource_relation( resolves, [Domain, Answer, Query ] ) :-
	resolves( Query, Answer, Domain ).
resource_relation_type( resolves, [domain, question, answer] ).

resource_relation( plan, [Domain, Task,stackset(Plan)] ) :-
	Domain : plan( Task, Plan ).
resource_relation_type( plan, [ ] ).

resource_relation( combine, [Domain, Q, A, P] ):-
	combine(Q, A, P, Domain ).
resource_relation_type( combine, [domain, question, answer, prop] ).

resource_relation( abstract, [Domain, A, P, Q] ):-
	abstract( A, P, Q, Domain ).
resource_relation_type( abstract, [domain, answer, prop, question] ).

resource_relation( incompatible, [Domain, P1, P2] ):-
	incompatible( P1, P2, Domain ).
resource_relation_type( incompatible, [domain, prop, prop] ).

resource_relation( proposition, [Domain, P] ):-
	Domain : sort_restr( P ).
resource_relation_type( proposition, [domain, prop] ).

resource_relation( question, [Domain, Q] ):-
	Domain : sort_restr( issue(Q) ).
resource_relation_type( question, [domain, question] ).

resource_relation( issue, [Domain, Q] ):-
	Domain : sort_restr( issue(Q) ).
resource_relation_type( issue, [domain, question] ).

resource_relation( action, [Domain, A] ):-
	Domain : sort_restr( action(A) ).
resource_relation_type( action, [domain, action] ).



%Q1 depends on Q
% modified to include "bind" and "raise" [SL031104]
resource_relation( depends, [Domain, Q1, Q] ):-
	Domain : plan( Q1, Plan ),
	( member( findout( Q ), Plan );
	    ( member( bind( Q ), Plan );
		member( raise( Q ), Plan ) ) ).

resource_relation( depends, [Domain, Q1, Q] ):-
	Domain : depends( Q1, Q ).
resource_relation_type( depends, [domain, question, question] ).



% default question
resource_relation( default_question, [Domain, Q] ):-
	Domain : default_question( Q ).
resource_relation_type( default_question, [domain, question] ).


% actions

resource_relation( postcond, [_Domain, Action, done(Action)] ).
resource_relation( postcond, [Domain, Action, Prop] ):-
	Domain : postcond( Action, Prop ).
resource_relation_type( postcond, [domain, action, prop ] ).


resource_relation( valid_parameter, [Domain, Prop] ) :-
	Domain : valid_parameter( Prop ).
resource_relation_type( valid_parameter, [domain, prop ] ).

resource_relation( dominates, [Domain, A1, A2] ) :-
	dominates( Domain, A1, A2).
resource_relation_type( dominates, [domain, action, action ] ).

resource_relation( hypernym, [Domain, A1, A2] ) :-
	Domain : hypernym( A1, A2 ).
resource_relation_type( hypernym, [domain, action, action ] ).

/*----------------------------------------------------------------------
     database
----------------------------------------------------------------------*/

is_resource_type( database ).

resource_variable_of_type( database, database ).

resource_of_type( travel, database ).
resource_of_type( autoroute, database ).

resource_relation( consultDB, [Database, Query, PropSet, Answer] ) :-
	Database : consultDB( Query, PropSet, Answer ), !.
%resource_relation( consultDB, [_, X^Q, _, notexist(Q) ] ).
resource_relation( consultDB, [_, X^Q, _, notexist(X,Q) ] ).
resource_relation( consultDB, [_, Q, _, unknown(Q) ] ).
resource_relation_type( consultDB, [database, question, set(prop), answer]).

resource_relation( consultDBx, [Database, Query, PropSet, AnswerSet] ) :-
	Database : consultDBx( Query, PropSet, AnswerSet ), !.
resource_relation( consultDBx, [_, X^Q, _, set([notexist(X,Q)]) ] ).
resource_relation( consultDBx, [_, Q, _, set([unknown(Q)])] ).
resource_relation_type( consultDB, [database, question, set(prop), answer]).


resource_relation( validDBparameter, [Database, Prop ] ) :-
	Database : validDBparameter( Prop ), !.
resource_relation_type( validDBparameter, [database, prop]).


/*----------------------------------------------------------------------
     device
----------------------------------------------------------------------*/

is_resource_type( upnp_dev ).

% note: "devices" is a record containing devices
% HACK 021818
%resource_variable_of_type( devices, record([vcr:upnp_dev, telephone:upnp_dev])).
resource_variable_of_type( devices, record([])).
%	findall( Var:upnp_dev, of_type( Var, upnp_dev ), R ).

% note: device_vcr etc. refers to actual devices ("tokens"), not types 

of_type( device_vcr, upnp_dev ).
of_type( device_telephone, upnp_dev ).
of_type( device_telvcr, upnp_dev ).
of_type( device_telvcrlogin, upnp_dev ).
of_type( device_agendatalk, upnp_dev ).

resource_relation( dev_get, [ Dev, Var, VarVal ] ) :-
	Dev : dev_get( Var, Val ),
	VarVal =.. [ Var, Val ].
resource_relation_type( dev_get, [device, _, _]).

% resource_relation( dev_query, [ Dev, Query, Answer ] ) :-
% 	Dev : dev_query( Query, Answer ).
% resource_relation_type( dev_query, [device, _, answer]).


%DH 21/3-2003 - to allow for parameters in device queries
resource_relation( dev_query, [Dev, Query, set(PropList), Answer ] ) :-
	Dev : dev_query( Query, PropList, Answer ).
resource_relation_type( dev_query, [device, _ , set(prop), answer]).

% SL 050302 - get all answers
resource_relation( dev_queryAll, [Dev, Query, set(PropList), set(AnswerList) ] ) :-
	Dev : dev_queryAll( Query, PropList, AnswerList ).
resource_relation_type( dev_query, [device, _ , set(prop), set(prop)]).



resource_relation( valid_parameter, [ Dev, Prop] ) :-
	Dev : valid_parameter( Prop ).
resource_relation_type( valid_parameter, [device, prop ]).


resource_operation( dev_set, Dev, [ Var, Val ], Dev ) :-
	Dev : dev_set( Var, Val ).
resource_operation_type( dev_set, device, [ _, _], device ).

resource_operation( dev_do, Dev, [ Action, set(PropList) ], Dev ) :-
	Dev : dev_do( Action, PropList ).
resource_operation_type( dev_do, device, [ action, set(prop) ], device ).

/*----------------------------------------------------------------------
     asr_grammar
----------------------------------------------------------------------*/
is_resource_type( asr_grammar ).

resource_variable_of_type( asr_grammar, asr_grammar ).

resource_of_type( asrg_vcr_english, asr_grammar ).
resource_of_type( asrg_travel_english, asr_grammar ).
resource_of_type( asrg_telvcr_english, asr_grammar ).
resource_of_type( asrg_telvcrlogin_english, asr_grammar ).
resource_of_type( asrg_telvcr_svenska, asr_grammar ).
resource_of_type( asrg_telvcrlogin_svenska, asr_grammar ).
resource_of_type( asrg_agenda_english, asr_grammar ).


resource_relation( language, [Grammar, L] ):-
        Grammar:language(L).
resource_of_type( language, [asr_grammar, atom] ).