/*************************************************************************
         name: domain_cellphone.pl
      version: Feb, 2005
  description: Mini Mobile Phone domain file
      authors: Anna Olsson and Jessica Villing
*************************************************************************/
:- module( domain_cellphone, [ plan/2,
			       postcond/2,
			       sort_restr/1,
			       valid_parameter/1
			     ] ).

:- discontiguous output_form/2, input_form/2, plan/2, postcond/2, incompatible/2.

:- use_module( library(lists), [ member/2, select/3, append/3 ] ).

:- ensure_loaded( library( semsort_cellphone ) ).


%%% Definition of yes/no questions

ynq( YNQ ):-
	YNQ \= _^_,		% whq
	YNQ \= [_|_].		% altq


/*----------------------------------------------------------------------
     plan( ?Name, ?Plan )
     -- Dialogue plan
----------------------------------------------------------------------*/

default( something_else ).

% ------------------------------
%%%% TOP
% ------------------------------

plan( top,
      [ forget_all,
	raise( X^action(X) ),
	findout( set( [ action(call),
			action(phonebook),
			action(settings) ] ) ) ] ).
postcond( top, none ).

% ------------------------------
%%%% CALL
% ------------------------------

plan( call,
      [ findout( set( [ action(call_name),
			action(call_number) ] ) ) ] ).
postcond( call, done(call_name) ).
postcond( call, done(call_number) ).

plan( call_name,
      [ findout( X^name(X) ),
	dev_do(cellphone, 'Call_name')
      ] ).
postcond( call_name, done('Call_name') ).

plan( call_number,
      [ findout( X^number(X) ),
	dev_do(cellphone, 'Call_number')
      ] ).
postcond( call_number, done('Call_number') ).


% ------------------------------
%%%% PHONEBOOK
% ------------------------------

plan( phonebook,
      [ findout( set( [ action(search_phonebook),
			action(add_new_entry),
			action(delete_entry) ] ) ) ] ).
postcond( phonebook, done(search_phonebook) ).
postcond( phonebook, done(add_new_entry) ).
postcond( phonebook, done(delete_entry) ).

plan( search_phonebook,
      [ findout( X1^name(X1) ),
	dev_do(cellphone, 'Search')
      ] ).  
postcond( search_phonebook, done('Search') ).


plan( add_new_entry,
      [ findout( X1^name(X1) ),
	findout( X2^number(X2) ),
	dev_do(cellphone, 'Add')
      ] ).
postcond( add_new_entry, done('Add') ).


plan( delete_entry,
      [ findout( X1^name(X1) ),
	%kolla mot databasen om entryt finns,
	%g�r i s� fall borttag.
	%finns det inte s� g�r respond att det inte fanns
	dev_do(cellphone, 'Delete')
      ] ).
postcond( delete_entry, done('Delete') ).




% ------------------------------
%%%% SETTINGS
% ------------------------------

plan( settings,
      [ findout( set( [ action(telephone_settings),
			action(security_settings),
			action(reset) ] ) ) ] ).

postcond( settings, done(telephone_settings) ).
postcond( settings, done(security_settings) ).
postcond( phonebook, done(reset) ).


plan( telephone_settings,
      [ findout( action(change_language) )
      ] ).
postcond( telephone_settings, done(telephone_settings) ).


plan( change_language,
      [ findout( X^language(X) ),
	dev_do( cellphone, 'Set_language' )
      ] ).
postcond( change_language, done('Set_language') ).


plan( security_settings,
      [ findout( action(change_security_code) )
      ] ).
postcond( security_settings, done(change_security_code) ).

%H�r kr�vs det att nummer fungerar
plan( change_security_code,
      [ findout( X1^number(X1) ),
	dev_do( cellphone, 'Set_security_code' )
      ] ).
postcond( change_security_code, done('Set_security_code') ).

% needed: some way of confirming wrong user input code..
%�ven h�r kr�vs det att nummer fungerar
plan( reset,
      [ findout( X^number(X) ),
	dev_do( cellphone, 'Reset')
      ] ).

postcond( reset, done('Reset') ).


% Lagt till sort_restr/1:
% ------------------------------
%%%% Conceptual knowledge
% ------------------------------

% action
sort_restr( action( X ) ) :-
	sem_sort( X, action ).
sort_restr( action( respond(Q) ) ) :-
	sort_restr( issue(Q) ).

% issue
sort_restr( issue(Q) ):-
	plan( Q, _ ),
	\+ sort_restr( action( Q ) ).

sort_restr( issue(Q) ):-
	plan( _, Plan ),
	member( findout(Q), Plan ),
	\+ sort_restr( action( Q ) ).

sort_restr( name( X ) ) :-
	sem_sort( X, name).

sort_restr( language( X ) ) :-
	sem_sort( X, language).

sort_restr( number( X ) ) :-
	sem_sort( X, number).

% Negation
sort_restr( \+ P ) :-
	sort_restr( P ).

% metaissue
sort_restr( und(_DP*P) ):-
	sort_restr(P).


% Lagt till valid_parameter/1:
% general case
valid_parameter( PX ):- % SL040831
	  PX =.. [P,X],
	  sem_sort(X, P).

% parameter validity; determines acceptance

valid_parameter( name( N ) ):- sem_sort( N, name ).

valid_parameter( number( N ) ):- sem_sort( N, number ).

valid_parameter( language( N ) ):- sem_sort( N, language ).

valid_parameter( security_code( N ) ):-
	sem_sort( N, number ).

% Lagt till depends/2:
depends(bla,bla).


% Lagt till incompatible/2 och singleton/1:
/*--------------------------------------------------------------
     Incompatible propositions cannot be in COM at the same time
----------------------------------------------------------------------*/


incompatible(Prop1,Prop2):-
	Prop1 =.. [P,_],
	Prop2 =.. [P,_],
	singleton(P).

singleton(add_entry).
singleton(delete_entry).


% Lagt till default_question/1:
/*--------------------------------------------------------------
     Default questions
     
     If A relevant to both Q1 and Q2, and none on QUD or ISSUES, and
     Q1 is default_question, then assume A is answer to Q1.

----------------------------------------------------------------------*/

default_question(dummy).