/*  program pro sledovani ukolu                                  */


/*  ukoly jsou v nejakem prologovskem souboru, tedy  *.plg       */
/*  tvar ukolu:                                                  */
/*  ukol(Co_se_dela,Kdo_dela,Do_kdy,Zadal,Kdy_zadal,Kdy_splneno) */
/*        data jsou ve tvaru                                     */
/*                                     datum(den,mesic,rok)      */
/*        neni-li ukol splnen je misto                           */
/*                                     Kdy_splneno  uvedeno "ne" */

/*  napr. ukol('spani',pepa,datum(1,1,87),hana,datum(31,12,86),ne).*/




/*  Navod: 
     1. napis  ?-zacni.
     2. muzes chtit  ukoly_dnes
                     ukoly_mesic
                     splnil
                     ukoly_pro(Nekoho)
                     ukoly_od(Nekoho_jineho)
                     novy_ukol
                     datum
     3. na konci napis     skonci  !!!!!!!!!!!!!!!!!!            */



ukoly_od(Kdo):-
     pis_dnes,
     ukol(CO,KOMU,TERMIN,Kdo,_,U), 
     write(CO),tab(7),write(KOMU),TERMIN=datum(D,M,R),tab(3),write([termin,D,M,R]), 
     udelano(U),nl,fail.


novy_ukol:-
     write('Pis kdo zadava    '),read(KDO),nl,
     write('Pis komu zadava   '),read(KOMU),nl,
     write('Pis co v '' ''    '),read(CO),nl,
     write('Pis do kdy        den. Enter mesic. Enter rok. Enter'),
     nl,read(DD),read(MM),read(RR),nl,
     dnes(D,M,R),
     asserta(ukol(CO,KOMU,datum(DD,MM,RR),KDO,datum(D,M,R),ne)).
     
udelano(U)
   :-( U=ne ;
      ( U=datum(D,M,R),
        write([ ' splneno  ',D,M,R])
      )
     ).

dnes(2,7,87).

datum
   :- write( 'pis dnesni datum   '),
      nl,
      write( '  pis den        DD.      '),
      read(D),
      nl,
      retract(dnes(_,_,_)),
      write( 'pis mesic        MM.      '),
      read(M),
      nl,
      write( 'pis rok          RR.      '),
      read(R),
      asserta(dnes(D,M,R)).

ukoly_mesic
   :- dnes(_,M,R),
      pis_dnes,
      ukol(C,K,datum(DD,MM,RR),_,_,ne),
      M=MM,
      R=RR,
      write(C),
      tab(7),
      write(K),
      write([ 'termin   ',DD,MM,RR]),
      nl,
      fail.

skonci
   :- soubor(Soubor),
      listing(ukol,Soubor),
      retract(soubor(_)),
      trace,
      old_buffer,
      new_program,
      notrace.


splnil
   :- write( '  Kdo  splnil ?   '),
      read(KDO),
      repeat,
      ukol(CO,KDO,_,_,_,ne),
      nl,
      write( '  Je to tohle    '),
      write(CO),
      nl,
      nl,
      write( '  Pis  ano./ne.   '),
      read(Souhlas),
      Souhlas=ano,
      retract(ukol(CO,KDO,T,S,TT,ne)),
      dnes(D,M,R),
      asserta(ukol(CO,KDO,T,S,TT,datum(D,M,R))).

pis_dnes
   :- nl,
      nl,
      write( '    Dnesni datum:      '),
      dnes(D,M,R),
      write([D,M,R]),
      nl,
      nl.

zacni
   :- datum,
      dnes(D,M,R),
      pis_dnes,
      write( 'napis jmeno souboru s ukoly  '),
      read(Soubor),
      asserta(soubor(Soubor)),
      reconsult(Soubor).

ukoly_dnes
   :- dnes(D,M,R),
      pis_dnes,
      ukol(C,K,datum(DD,MM,RR),_,_,ne),
      mensi(DD,MM,RR,D,M,R),
      write(C),
      tab(6),
      write(K),
      nl,
      fail.

mensi(_,_,R,_,_,RR)
   :- R<RR.
mensi(_,M,R,_,MM,RR)
   :- R=RR,
      M<MM.
mensi(D,M,R,DD,MM,RR)
   :- R=RR,
      M=MM,
      D<DD.

ukoly_pro(J)
   :- pis_dnes,
      ukol(C,J,datum(D,M,R),_,_,Udelano),
      write(J),
      tab(9),
      write(C),
      write([ 'termin  ',D,M,R]),
      udelano(Udelano),
      nl,
      fail.

ite(J),
      tab(9),
      write(C),
      write([ 'termin  ',D,M,R]