% Author:
% Date: 24/11/2010

% Afficher les manques et les n°s d'immatriculation
% des voitures, dont les propriétaires sont des hommes
%
% q5 :- afficheElt[(Ma, No), (voiture(No, Ma, P, ...), personne(P, m, ..., ..., ...)].
%
% Bdd virtuelle
% bddvirt(nomBdd, clef, nomChamp, VarDuChamp)
% bddvirt(voiture, Nu, marqueVoiture, Ma).
%                  Nu : Numéro immatriculation
% bddvirt(personne, P, age, Age).
% bddvirt(personne, P, sexe, S).
%                  P : Propriétaire
%
% Dictionnaire
%
% voiture : [ numero, marque, propriétaire, couleur ]
% personne : [nom, sexe, age, pere, mere ]
%
% Nouvel affichage :
% afficheElt[P, ( bddvirt(voiture, Nu, marque, volvo),
%                 bddvirt(voiture, Nu, couleur, rouge),
%                 bddvirt(voiture, Nu, propriétaire, P)]
%
% voiture -> dynamique
% Déclarer la bdd dynamique avant de l'utiliser
% :- dynamic(voiture/4).
% :- dynamic(personne/5).
%
% ajouter des champs
% asserta( voiture(..., ..., ..., ..., ...) ).
%
% Retirer des champs
% retract( voiture(..., ..., ..., ..., ...) ).

:- dynamic(voiture/4).

:- op(1100,fx,afficheTout).
:- op(1100,fx,afficheElement).

for(X,Y):- X,Y,fail.
for(_X,_Y).

afficheElement[Elt,Critere] :- nl,
                               for(Critere,(write(Elt),nl)).
                               
afficheTout X :- afficheElement[X,X].

% Pas besoin de declarer age dynamic car non-existante


moyenne(Age) :-
       age(S,N),
       retract(age(_,_)),
       Nn is N + 1,
       Sn is S + Age,
       asserta(age(Sn,Nn)).
       
age(M) :-
       asserta( age(0, 0) ),
       for( personne( _, _, Age, _, _), moyenne(Age) );
       age(Age,N),
       retract(age(_,_)),     % supprime tout les prédicats age/2
       M is Age/N.%,
       %write('Age moyenne ='),
       %write(M),
       %nl.