- una lista di genitori
- una lista di `field`/`metodi`
-Per definire la def_class si inseriscono variabili che rappresentano ed i metodi che definiscono il comportamento della classe.
+Per definire la def_class si inseriscono variabili
+che rappresentano ed i metodi che definiscono il comportamento
+della classe.
*** Implementazione
#+begin_src prolog :tangle oop.pl
Sostanzialmente craiamo il costruttore della classe.
-Prima di creare l'istanza si controlla che l'atono non sia già un'istanza di una classe.
-Se esiste non si procede con l'operazione, in quanto rindondante, in caso contrario si passa alla creazione effettiva dell'istanza.
+Prima di creare l'istanza si controlla che l'atono non sia
+già un'istanza di una classe.
+Se esiste non si procede con l'operazione, in quanto rindondante,
+in caso contrario si passa alla creazione effettiva dell'istanza.
Dopo di che:
-- Se non viene dato il campo /Fields/ allora si crea un istanza con i valore di default della classe.
-- Se abbiamo il campo /Fields/ associamo ai fields dell'istanza i valori di default e successivamente quelli presenti in /Fields/.
-- Se fallisce la creazione dell'istanza si elimanano le eventuali informazioni residue dalla base di conoscenza.
+- Se non viene dato il campo /Fields/ allora si crea un
+ istanza con i valore di default della classe.
+- Se abbiamo il campo /Fields/ associamo ai fields dell'istanza i valori
+ di default e successivamente quelli presenti in /Fields/.
+- Se fallisce la creazione dell'istanza si elimanano le eventuali
+ informazioni residue dalla base di conoscenza.
*** Implementazione
*** Definizione
Assegna dinamicamente ed estrae il valore di un field di un'istanza.
-Questa funzione svolge lo stesso compito di un getter/setter in un *inferiore* linguaggio ad oggetti, ovvero una funzione che fornisce un modo controllato per accedere al valore di un attributo all'interno di un'istanza.
+Questa funzione svolge lo stesso compito di un getter/setter in
+un *inferiore* linguaggio ad oggetti, ovvero una funzione che fornisce
+un modo controllato per accedere al valore di un attributo all'interno di
+un'istanza.
*** Implementazione
#+begin_src prolog :tangle oop.pl
** fieldx
*** Definizione
Estrae il valore dalla classe percorrendo una catena di attributi.
-Il caso base del metodo è quando /FieldName/ è una lista formata da un solo elemento, con il predicato /field/ possiamo estrattre l'ultimo (e solo) valore di /FieldName./
-Se /FieldName/ ha più elementi possiamo richiamare il metodo ricorsivamente sulla coda della lista finchè la lista non avrà un solo elemento riportandoci al caso base.
+Il caso base del metodo è quando /FieldName/ è una lista formata da
+un solo elemento, con il predicato /field/ possiamo estrattre l'ultimo
+(e solo) valore di /FieldName./
+Se /FieldName/ ha più elementi possiamo richiamare il metodo ricorsivamente
+sulla coda della lista finchè la lista non avrà un solo elemento
+riportandoci al caso base.
*** Implementazione
#+begin_src prolog :tangle oop.pl
** inst
*** Definizione
-Dato un oggetto che rappresenta un'istanza restituisce il nome dell'istanza.
-Si nella nostra implementazione è banale perchè l'oggetto che rappresenta l'istanza è il nome dell'istanza.
+Dato un oggetto che rappresenta un'istanza restituisce il nome
+dell'istanza.
+Si nella nostra implementazione è banale perchè l'oggetto che rappresenta
+l'istanza è il nome dell'istanza.
*** Implementazione
#+begin_src prolog :tangle oop.pl
* Predicati helper
** Predicati dinamici
-Predicati usati dal metodo /asserta/, svolgono una funzione di controllo per diverse entità.
+Predicati usati dal metodo /asserta/, svolgono una funzione di controllo
+per diverse entità.
#+begin_src prolog :tangle oop.pl
:- dynamic is_class/1.
#+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.
+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*).
+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]) :-
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`.
+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]) :-
add_part(ClassName, OtherParts).
#+end_src
-Se viene dato un `method` allora definiamo nella base di conoscenza un predicato `Name(InstanceName, ArgList)`.
+Se viene dato un `method` allora definiamo nella base di conoscenza un
+predicato `Name(InstanceName, ArgList)`.
#+begin_src prolog :tangle oop.pl
add_part(ClassName, [method(Name, ArgList, Body) | 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.
+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, []) :- !.
#+end_src
** Costruzione di un'istanza
-Fai il binding tra i `field` di un classe e quelli di un'istanza come `add_part`.
+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, []) :- !.
** Sostituzione del termine `this`
-Predicato che viene usato per sostituire 'this' con la vera istanza utilizzata (<Result>).
+Predicato che viene usato per sostituire 'this' con la vera istanza
+utilizzata (<Result>).
#+begin_src prolog :tangle oop.pl
replace(OldTerm, NewTerm, Body, NewTerm) :- Body == OldTerm, !.