

?-op(160,xfx,at).
?-op(155,fx,od).
?-op(150,xfx,ze).
?-op(145,xfx,pro).
?-op(140,xfx,do).

?-op(170,fx,pridej_ukol).
?-op(170,fx,zrus_ukol).
?-op(170,fx,vypis_ukol).

?-op(120,xfx,pred).
?-op(120,xfx,po).

D1/M1/R1 pred D2/M2/R2 :- R1=R2,M1=M2,D1<D2;
                          R1=R2,M1<M2;
                          R1<R2.

Datum1 po Datum2 :- Datum2 pred Datum1.

pod_sebou(_,_). /* pozdeji bude podrizenost osob */
                /*    pod_sebou(Chudak,Sef)      */

udelej(konec)
   :- !.
udelej(pridej_ukol (Ukol))
   :- validuj(Ukol),
      assertz(Ukol),
      nl,write('Ukol byl pridan   '),nl,nl,
      !.
udelej(pridej_ukol (Ukol))
   :- !,
      write( 'Spatne zadany ukol'),nl,nl.

udelej(zrus_ukol  (Ukol1))
   :- validuj2(Ukol1,Ukol2),
      setof(Ukol2,Ukol1,MU),
      nl,
      write( 'zrusilo by se'),
      write(MU),
      nl,
      write( 'je to vporadku ?'),
      write( '...ano/ne'),
      read(ano),
      retractset(MU),
      !.
udelej(zrus_ukol (Ukol))
   :- nl,
      write( 'Nic jsem nezrusil'),
      !.
udelej(vypis_ukol (Ukol))
   :- validuj2(Ukol,Ukol2),
      setof(Ukol2,Ukol,MU),
      nl,
      write(MU),
      !.

udelej(_):-nl,nl,write('Eh, eh ?!'),nl,nl.

bud_zdrav
   :- retract(dnes_je(D)),
      write( 'Program se louci a preje splneni vsech ukolu'),
      nl,nl,
      write( 'jeste budu chvili pracovat na ulozeni souboru').




dobry_den
   :- write( 'Vita vas program pro sledovani ukolu. Program umoznuje ...'),
      nl,nl,
      write( 'napis dnesni datum ve tvaru d/m/r, napr. 20/3/87.     '),
      read(D),
      asserta(dnes_je(D)),
      !.

co_chces(Akce)
   :- nl,
      write( 'Nabizim ti tyto akce'),nl,nl,
      nl,
      write(pridej_ukol),
      nl,
      write(zrus_ukol),
      nl,
      write(vypis_ukol),
      nl,
      write(konec),
      nl,nl,nl,
      read(Akce),nl,nl.


zacni
   :- dobry_den,
      consult(dbaze),
      consult(setof),
      repeat,
      co_chces(Akce),
      udelej(Akce),
      Akce=konec,
      !,
      bud_zdrav,
      listing(at,dbaze),
      retractall(at(_,_)).

validuj2((U1,Cile),U1)
   :- !,
      validuj2(U1,U1).
validuj2(od Z ze DZ pro CH do DD at C,od Z ze DZ pro CH do DD at C)
   :- (var(DZ);DZ=_/_/_),
      (var(DD);DD=_/_/_),
      (var(Z);pod_sebou(_,Z)),
      (var(CH);pod_sebou(CH,_)).

validuj(od Z ze DZ pro CH do D at C)
   :- nonvar(Z),
      nonvar(CH),
      pod_sebou(Z,CH),
      datum(DZ),
      datum(D).









datum(D/M/R):-
    den(D),mesic(M),rok(R).
den(D):- var(D),!,dnes_je(D/_/_).
den(D):- integer(D),D=<31,D>0.

mesic(M):- var(M),!,dnes_je(_/M/_).
mesic(M):- integer(M),M=<12,M>0.

rok(R):- var(R),!,dnes_je(_/_/R).
rok(R):- integer(R),R=<100.
 var(M),!,dnes_je(_/M/_).
mesic(M):- integer(M),M=<12,M>0.

rok(R):- var(R),!,dnes_je(_/_/R).
rok(R):- integer(R),