From bd83341cd41ba637cb454eeaf9c275a74d7d6dc1 Mon Sep 17 00:00:00 2001 From: LeonardoBizzoni Date: Mon, 8 Jan 2024 16:43:02 +0100 Subject: [PATCH] Tagliato tutto a <80 colonne --- Prolog/README.org | 67 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 47 insertions(+), 20 deletions(-) diff --git a/Prolog/README.org b/Prolog/README.org index ed36e47..7a949e4 100644 --- a/Prolog/README.org +++ b/Prolog/README.org @@ -15,7 +15,9 @@ Definisce la struttura di una classe, dato: - 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 @@ -131,13 +133,18 @@ Istanzia una classe dato: 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 @@ -189,7 +196,10 @@ make(Instance, bar, [bar = "69"]). %% Instance = b; false. *** 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 @@ -208,8 +218,12 @@ field(root, value, X). %% X = 200 ** 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 @@ -229,8 +243,10 @@ fieldx(fb, [foo,bar,foobar], Result). ** 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 @@ -247,7 +263,8 @@ inst(fb, root). %% false. * 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. @@ -258,14 +275,19 @@ Predicati usati dal metodo /asserta/, svolgono una funzione di controllo per div #+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]) :- @@ -292,7 +314,8 @@ 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]) :- @@ -324,7 +347,8 @@ 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]) :- @@ -342,7 +366,8 @@ 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, []) :- !. @@ -357,7 +382,8 @@ 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`. +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, []) :- !. @@ -392,7 +418,8 @@ set_fields(InstanceName, _ClassName, _Fields) :- ** Sostituzione del termine `this` -Predicato che viene usato per sostituire 'this' con la vera istanza utilizzata (). +Predicato che viene usato per sostituire 'this' con la vera istanza +utilizzata (). #+begin_src prolog :tangle oop.pl replace(OldTerm, NewTerm, Body, NewTerm) :- Body == OldTerm, !. -- 2.52.0