% member(X,P) est la fonction prédéfinie que nous aviosn appelée appartient(X,P). % les données listeli([sauternes,loupiac,layon]). li(X):-listeli(L),member(X,L). listebl([graves,vouvray,viognier,deuxmers,sancerre,cassis]). bl(X):-listebl(L),member(X,L). listero([pessac,medoc,emilion,ventoux,pape,chinon,saumur]). ro(X):-listero(L),member(X,L). lister([cassis,pape,ventoux,viognier]). rhone(X):-lister(L),member(X,L). listel([vouvray,sancerre,layon]). loire(X):-listel(L),member(X,L). listeb([sauternes,loupiac,graves,deuxmers,pessac, medoc,emilion]). bordelais(X):-listeb(L),member(X,L). listeprix([[sauternes,12],[loupiac,8],[layon,10],[graves,9],[vouvray,7],[viognier,7],[deuxmers,5],[sancerre,10],[cassis,8],[pessac,13],[medoc,14],[emilion,12],[ventoux,8],[pape,20],[chinon,7],[saumur,6],[vouvray,8]]). % trouver le prix d'un vin prix(X,P):-listeprix(L),member([X,P],L). % un programme qui saisit le nom du client % le montant maximum de son achat % le type de produit acheté % la préférnce du client sur l'origine du produit % sous la forme d'une liste [regoin1,region2] avec un nombre de régions non borné % ou [aucune] si le client n'pas de préférence % et qui répond en premier le produit trouvé qui est cherché d'abord dans region1 puis dans région2 etc. % et dans touts les régions si la préférence est [aucune]. % affiche le produit trouvé et son prix % ou signale qu'il n'y a pas de tel produit. achat:-writeln('Cher client, quel est votre nom ou identifiant'), read(Client), writeln('Quel montant souhaitez-vous mettre'), read(MAX), writeln('Quel type de vin souhaitez-vous acheter (blanc sec: bl/liquoreux: li/ rouge:ro)?'), read(T), writeln('Donnez vos regions d''origine preferes (liste ordonnée de noms parmi rhone, bordelais, loire,aucune)'),read(LPrefs),write('Cher(e)'),writeln(Client), % appel de la recherche de solution avec les bons paramètres achete(X,T,P,MAX,Lprefs), write('Nous vous conseillons un '),write(X),write(' dont le prix est '),write(P), writeln(' euros.'); writeln('Desole, nous n''avons pas de vin répondant a vos criteres.'). % achete(Produit,Type,Prix,PrixMax,ListePrefRegion) % trouve, en suivant les préférences région % un produit X de type Type et de prix Prix< PrixMAx achete(X,T,P,MAX,Lprefs):-type(X,T),prix(X,P),P0 bouteilles de blanc sec'), read(BL),writeln('Prix max par bouteille '),read(MBL), writeln('Preference region'),read(LBL), writeln('Nbre >0 bouteilles de blanc liquoreux'), read(LI),writeln('Prix max par bouteille'),read(MLI), writeln('Preference region'),read(LLI), writeln('Nbre >0 bouteilles de rouge'), read(RO),writeln('Prix max par bouteille'),read(MRO), writeln('Preference region'),read(LRO), 12 is BL+LI+RO, achete(U,bl,PU,MBL,LBL), achete(V,li,PV,MLI,LLI), achete(W,ro,PW,MRO,LRO), writeln('Nous vous conseillons'), write(BL),write(' bouteilles de '),write(U),write(' a '),writeln(PU), write(LI),write(' bouteilles de '),write(V),write(' a '),writeln(PV), write(RO),write(' bouteilles de '),write(W),write(' a '),writeln(PW), Prix is BL*PU + LI*PV + RO+PW, write('Pour un total de '),write(Prix),write(' euros').