#+end_src
** Controllo dei tipi
+
+Si definiscono i controlli dei tipi e delle classi con /type_check/.
+Sono tutti dei semplici metodi di controllo, se la variabile è del tipo corrento viene restitituo true.
+
#+begin_src prolog :tangle oop.pl
type_check(_X, nil) :- !.
type_check(nil, _X) :- !.
** Definizione di una classe
*** Effettivo predicato `def_class`
+
+Defininiamo la classe, controllando che essa già non sia presente nella base di conoscenza ed
+ereditiamo, se esistenti, field da una classe genitore.
+
#+begin_src prolog :tangle oop.pl
wrapped_def_class(ClassName, Parents, Parts) :-
nonvar(ClassName),
#+end_src
*** Ereditazione di field da superclass
+
+Metodo che permette di ereditare i campi dal genitore,
+dopo aver verificato la presenza di una classe /Parent/,
+si cercano i method del genitore e si aggiungono alla sottoclasse.
+
#+begin_src prolog :tangle oop.pl
set_superclass(_ClassName, []) :- !.
set_superclass(ClassName, [Parent | OtherParents]) :-
** Istanziazione di una classe
*** Effettivo predicato `make`
+
+Si crea l'effetiva classe, controllando i parametri d'ingrsso e inserendo i campi della classe.
+Sia passati in ingresso che quelli ereditati da un eventuale genitore.
+
#+begin_src prolog :tangle oop.pl
wrapped_make(InstanceName, ClassName, Fields) :-
is_list(Fields),
#+end_src
*** Assegnamento dei valori ereditati dalla superclass all'istanza
+
+Vengono trovati e assegnati i field alla classe figlio.
+
#+begin_src prolog :tangle oop.pl
instanciate_superclass(InstanceName, ClassName) :-
%% Trova tutti i field della classe da istanziare
#+end_src
** Ricerca di un'istanza
+
+Metodo per cercare un'istanza.
+SI verifica che esista l'istanza e si controlla ricorsivamente la lista dei campi,
+se l'istanza non ha field allora si controlla solo l'esistenza dell'istanza.
+
#+begin_src prolog :tangle oop.pl
search_instance(InstanceName, ClassName, [=(Field,Value) | Other]) :-
is_instance(InstanceName, ClassName),