/* modifiche a klone */


/* has_vr non riporta il valore quando il ruolo e' ereditato */

has_vr_x(R,C,VR) :-
   has_vr(R,C,VR), !.
has_vr_x(R,C,VR) :-
   has_super_concept(C,C1),
   has_vr_x(R,C1,VR), !.



/* pretty print di un concetto individuale */

ppi(I_conc) :-
            individual_concept(I_conc),
            write(I_conc),write(' e_ un concetto individiale'),nl,
            individuates(I_conc,G_conc), !,
            write(I_conc),write(' e_ un '),write(G_conc),nl,
            stampa_ruoli(I_conc,G_conc).

stampa_ruoli(I_conc,G_conc) :-
             has_role(I_conc,I_role),
             write(I_role),write(' e_ un instance_role '),nl, 
             satisfies(I_role,I_conc,G_role,G_conc),
             write(' che individua il '),write(G_role),
             write(' di '),write(G_conc),
             stampa_valore(I_role,I_conc,Value),
             fail.
stampa_ruoli(_,_).

stampa_valore(Ir,Ic,V):- has_value(Ir,Ic,V),nonvar(V),
                         write('  valore '),write(V),nl,!.
stampa_valore(Ir,Ic,V):- write(' non ha nessun valore '),nl,!.
             

assegna_valore(Valore,_,_) :- var(Valore), !.
assegna_valore(not(Valore),Ir,Ic) :-
             !,
             individuates(Ic,Gc),
             satisfies(Ir,Ic,Gr,Gc),
             has_vr_x(Gr,Gc,VR),
             (individuates(Valore,VR),
             assume(has_value(Ir,Ic,not Valore)),!;
             write(Valore),write(' non e_ '),write(VR),nl).
assegna_valore(Valore,Ir,Ic) :-
             individuates(Ic,Gc),
             satisfies(Ir,Ic,Gr,Gc),
             has_vr_x(Gr,Gc,VR),
             (individuates(Valore,VR),
             assume(has_value(Ir,Ic,Valore)),!;
             write(Valore),write(' non e_ '),write(VR),nl).

assegna_ruolo(Ir,Ic,Gr,Gc) :-
  add(Ic,Ir,instance_role), /*  assume(instance_role(Ir)),*/
  assume(has_role(Ic,Ir)),
  assume(satisfies(Ir,Ic,Gr,Gc)).


trova_valore(Ic,Gr,Value) :-
    satisfies(Ir,Ic,Gr,Gc),
    has_value(Ir,Ic,Value1),!, Value = Value1 .
trova_valore(Ic,Gr,Value) :-
    satisfies(Ir,Ic,Gr,Gc).


