Expert/expert.pl
2019-06-03 22:56:51 +02:00

190 lines
4.2 KiB
Prolog

pref(P,X) :-
nb_current(P,_),
nb_getval(P,Y),
!,
( Y = X
; ( Y = nie(Z), Z \= X)
; Y = cokolwiek).
pref(P,X) :-
znajdzPCechy(P,XS),
format("wybierz ~w\n", [P]),
format("do wyboru masz:\n"),
forall(member(I,XS), format("- ~w\n",[I])),
format("- cokolwiek\n"),
read(Y),
nb_setval(P,Y),
( Y = X
; ( Y = nie(Z), Z \= X)
; Y = cokolwiek).
prefb(P,X) :-
nb_current(P,_),
nb_getval(P,Y),
!,
Y=X.
prefb(P,X) :-
format("~w? (tak lub nie)\n",[P]),
read(Y),
nb_setval(P,Y),
Y = X.
termin(XS) :-
nb_current(termin,_),
nb_getval(termin,Y),
!,
member(X,XS),
( (Y1-Y2 = Y, X >= Y1, X =< Y2)
; (nie(Y1-Y2) = Y, (X < Y1 ; X > Y2))
),
!.
termin(XS) :-
format("wybierz termin jaki ci odpowiada\n"),
format("przykladowo:\n"),
format("3-5 (dowolny miesiac od marca do maja)\n"),
format("nie(3-5) (dowolny miesiac nie bedacy miedzy marcem a majem)\n"),
read(Y),
nb_setval(termin,Y),
member(X,XS),
( (Y1-Y2 = Y, X >= Y1, X =< Y2)
; (nie(Y1-Y2) = Y, (X < Y1 ; X > Y2))
),
!.
ilosc(X) :-
nb_current(ilosc,_),
nb_getval(ilosc,I),
!,
X = I.
ilosc(X) :-
format("ilu ludzi chce jechac?\n"),
read(I),
nb_setval(ilosc,I),
X = I.
cena(X) :-
nb_current(maxCena,_),
nb_getval(maxCena,Y),
!,
ilosc(I),
X*I=<Y.
cena(X) :-
format("maksymalna cena jaka jestes w stanie zaplacic:\n"),
read(Y),
nb_setval(maxCena, Y),
ilosc(I),
X * I =< Y.
currentWakacjeAll(X) :-
nb_getval(all,X).
clear :-
forall(member(A, [kraj,teren, termin, maxCena, dzieci,all,ilosc]), nb_delete(A)).
znajdzWakacje(Y) :-
wakacjeAll(All),
nb_setval(all,All),
znajdzWakacje(X,All),
ilosc(_),
ansi_format([bold],"Te propozycje odpowiadaja twoim preferencjom\n\n",[]),
forall(member(M,X), wyswietlWakacje(M)),
include(odpowiedniaCena, X,Y),
format("\n\n\n"),
ansi_format([bold],"O to wszystkie oferty ktore odpowiadaja twoim preferencja i ktore odpowiadaja ci finansowo\n",[]),
forall(member(M,Y), wyswietlWakacje(M)),
clear.
odpowiedniaCena(w(_,C,_)) :-
cena(C).
znajdzWakacje([],[]).
znajdzWakacje([X|XS],[X|_]) :-
X = w(_,_,L),
forall(member(C,L), call(C)),
znajdzPWakacje(W),
delete(W,X,W2),
nb_setval(all,W2),
znajdzWakacje(XS,W2).
znajdzPCechy(P,Y2) :-
znajdzPWakacje(W),
findall(X, (member(w(_,_,L),W),member(pref(P,X),L)),Y),
sort(Y,Y2).
znajdzPWakacje(X) :-
currentWakacjeAll(All),
include(sprawdzPWakacje, All,X).
sprawdzPWakacje(w(_,_,L)) :-
forall(member(X,L), sprawdzPCeche(X)).
sprawdzPCeche(pref(P,X)) :-
(\+ nb_current(P,_)); pref(P,X).
sprawdzPCeche(prefb(P,X)) :-
(\+ nb_current(P,_)) ; prefb(P,X).
sprawdzPCeche(termin(X)) :-
(\+ nb_current(termin,_)) ; termin(X).
niesprecyzowanyKraj :-
pref(kraj, cokolwiek).
wyswietlCeche(pref(P,X)) :-
format("~w: ~w\n",[P,X]).
wyswietlCeche(prefb(P,X)) :-
format("~w: ~w\n",[P,X]).
wyswietlCeche(termin(L)) :-
format("termin: ~w\n", [L]).
wyswietlCeche(_).
wyswietlWakacje(w(N,C,L)) :-
format("~w\n", [N]),
ilosc(I),
format("cena za osobe: ~w\n", [C]),
C2 is I * C,
format("dla ~w osob wyniesie to lacznie ~w\n", [I,C2]),
forall(member(X,L), wyswietlCeche(X)),
format("\n").
wakacjeAll([ w(zakopane, 1000, [pref(kraj,polska), pref(teren,gory)])
, w(hawaje, 3000, [termin([6,7,8]), pref(kraj,usa), pref(teren, morze)])
, w(hawaje, 2000, [termin([1,2,3,4,5,9,10,11,12]), pref(kraj,usa), pref(teren,morze)])
, w(himalaje, 4000, [niesprecyzowanyKraj, pref(teren, gory), prefb(dzieci, nie)])
, w(hel, 1200, [pref(teren, morze), pref(kraj, polska), termin([5,6,7,8])])
, w(mazury, 800, [pref(teren, jezioro), pref(kraj, polska), termin([4,5,6,7])])
, w(bieszczady, 1200, [pref(teren, gory), pref(kraj, polska)])
]).