* Primitive principali
** def_class
*** Definizione
-Definisce la struttura di una classe.
+Definisce la struttura di una classe, dato:
+- un nome
+- una lista di genitori
+- una lista di `field`/`metodi`
+
+Descrivi come definisci una classe in Java.
*** Implementazione
#+begin_src prolog :tangle oop.pl
** make
*** Definizione
-Definisce una nuova istanza della classe
+Istanzia una classe dato:
+- il nome dell'istanza
+- la classe da istanziare
+- una lista di `assegnamenti`
+
+Descrivi un costruttore di Java.
*** Implementazione
#+begin_src prolog :tangle oop.pl
make(Instance, foobar). %% Instance = fb.
make(Instance, bar, [bar = "69"]). %% Instance = b; false.
#+end_src
-
** field
*** Definizione
Estrae il valore di una classe da un campo
+Descrivi un getter in Java.
+
*** Implementazione
#+begin_src prolog :tangle oop.pl
:- dynamic field/3.
* Predicati helper
** Predicati dinamici
+Predicati usati con `assert` guarda dove vengono usati e scrivi 2 righe.
+
#+begin_src prolog :tangle oop.pl
:- dynamic is_class/1.
:- dynamic is_child_of/2.
#+end_src
** Aggiunta di `field` e `metodi`
+Data una classe devo poter dire che un `field` appartiene alla classe che sto definendo.
+Se non ci sono `field`/`metodi` da bindare allora è finita la definizione delle parti della classe.
+
#+begin_src prolog :tangle oop.pl
add_part(ClassName, []) :- is_class(ClassName), !.
+#+end_src
+
+Se viene dato un `field` privo di tipo controlliamo che non sia già presente nella base di conoscenza e se lo è lo cancelliamo sennò facciamo il binding di classe e field dicendo che il tipo è `nil` e quindi dinamico(stile *python*).
+
+#+begin_src prolog :tangle oop.pl
add_part(ClassName, [field(Name, Value) | OtherParts]) :-
is_class(ClassName),
is_member(field(Name, _, _), ClassName),
!,
asserta(is_member((field(Name, Value, nil)), ClassName)),
add_part(ClassName, OtherParts).
+#+end_src
+
+Se invece viene dato un `field` come prima controlliamo se è già definito ma inoltre controlliamo che il `value` sia dello stesso tipo di `type`.
+#+begin_src prolog :tangle oop.pl
add_part(ClassName, [field(Name, Value, Type) | OtherParts]) :-
is_class(ClassName),
is_member(field(Name, _, _), ClassName),
type_check(Type, Value),
asserta(is_member(field(Name, Value, Type), ClassName)),
add_part(ClassName, OtherParts).
+#+end_src
+
+Se viene dato un `method` allora chiedi a Mirko come funzione sta stregoneria.
+Definiamo nella base di conoscenza un predicato `Name(InstanceName, ArgList)`.
+#+begin_src prolog :tangle oop.pl
add_part(ClassName, [method(Name, ArgList, Body) | OtherParts]) :-
is_list(ArgList),
is_class(ClassName),
asserta(is_member(method(Name, ArgList, Body), ClassName)),
Head =.. [Name, InstanceName | ArgList],
!,
- replace(this,InstanceName,Body,NewBody),
+ replace(this, InstanceName, Body, NewBody),
asserta(Head :- (is_instance(InstanceName, ClassName), NewBody, !)),
add_part(ClassName, OtherParts).
#+end_src
** Impostazione dei field ereditati
+Mi dai una lista di `field` presi da una superclass e fai il binding anche con questa classe.
+
#+begin_src prolog :tangle oop.pl
set_superclass_fields(_InstanceName, _ClassName, []) :- !.
set_superclass_fields(InstanceName,
#+end_src
** Costruzione di un'istanza
+Fai il binding tra i `field` di un classe e quelli di un'istanza come `add_part`.
+
#+begin_src prolog :tangle oop.pl
set_fields(_InstanceName, _ClassName, []) :- !.
set_fields(InstanceName,
#+end_src
** Sostituzione di termine
+Magia nera chiedi a Mirko.
+
#+begin_src prolog :tangle oop.pl
replace(Subterm0, Subterm, Term0, Term) :-
Term0 == Subterm0,