From: LeonardoBizzoni Date: Sun, 24 Dec 2023 18:24:39 +0000 (+0100) Subject: Breve descrizione per Matte X-Git-Url: http://git.leonardobizzoni.com/?a=commitdiff_plain;h=f5186fa14be2b8944b6ff4c17f85f23ab69b30da;p=ObjectOriented-Prolog-Lisp Breve descrizione per Matte --- diff --git a/Prolog/README.org b/Prolog/README.org index 2ecb26b..70a4723 100644 --- a/Prolog/README.org +++ b/Prolog/README.org @@ -10,7 +10,12 @@ * 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 @@ -116,7 +121,12 @@ def_class(node, [], [field(value, 0, integer), ** 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 @@ -164,11 +174,12 @@ make(root, node, [value = 200]). %% true. 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. @@ -211,6 +222,8 @@ fieldx(fb, [foo,bar,foobar], Result). * 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. @@ -220,8 +233,16 @@ fieldx(fb, [foo,bar,foobar], Result). #+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), @@ -236,7 +257,11 @@ add_part(ClassName, [field(Name, Value) | OtherParts]) :- !, 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), @@ -254,19 +279,26 @@ add_part(ClassName, [field(Name, Value, Type) | OtherParts]) :- 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, @@ -278,6 +310,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`. + #+begin_src prolog :tangle oop.pl set_fields(_InstanceName, _ClassName, []) :- !. set_fields(InstanceName, @@ -300,6 +334,8 @@ set_fields(InstanceName, _ClassName, _Fields) :- #+end_src ** Sostituzione di termine +Magia nera chiedi a Mirko. + #+begin_src prolog :tangle oop.pl replace(Subterm0, Subterm, Term0, Term) :- Term0 == Subterm0,