]> git.leonardobizzoni.com Git - ObjectOriented-Prolog-Lisp/commitdiff
Breve descrizione per Matte
authorLeonardoBizzoni <leo2002714@gmail.com>
Sun, 24 Dec 2023 18:24:39 +0000 (19:24 +0100)
committerLeonardoBizzoni <leo2002714@gmail.com>
Sun, 24 Dec 2023 18:24:39 +0000 (19:24 +0100)
Prolog/README.org

index 2ecb26ba087d45dff5f2926f4446679a58083d15..70a4723f81aa097226dd024a41dc847da1ec2812 100644 (file)
 * 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,