]> git.leonardobizzoni.com Git - ObjectOriented-Prolog-Lisp/commitdiff
Rimossa la disgiunzione perchè ad Antoniotti sta sul cazzo
authorLeonardoBizzoni <leo2002714@gmail.com>
Sun, 17 Dec 2023 08:07:05 +0000 (09:07 +0100)
committerLeonardoBizzoni <leo2002714@gmail.com>
Sun, 17 Dec 2023 08:07:05 +0000 (09:07 +0100)
`is_part_of` mo si chiama `is_member` perchè era troppo lungo da scrivere.

Se viene inserito un `field` formato da solo nome e valore, il suo
tipo di defult è `nil` questo per evitare di scrivere più volte ogni
funzione che usa la `findall` per trovare `field`.
Antoniotti culo.

Prolog/README.org
Prolog/oop.pl

index 84a7c4a64acbcd6d7ffe8c2691a8526ce805dfa3..098b5d1e5e595687d4e3d7d3a4d4487288bf639f 100644 (file)
 %%%% <Cognome> <Nome> <Matricola>
 %%%% <eventuali collaborazioni>
 
+%% Ogni volta che viene valutato il file oop.pl pulisce
+%%     la base di conoscenza.
+%% Poi si leverà.
+:- abolish(is_class/1).
+:- abolish(is_child_of/2).
+:- abolish(is_member/2).
+:- abolish(is_instance/1).
+:- abolish(is_instance/2).
+
 def_class(ClassName, []) :- asserta(is_class(ClassName)), !.
 def_class(ClassName, [Parent | OtherParents]) :-
     is_class(Parent),
@@ -21,14 +30,14 @@ def_class(ClassName, [Parent | OtherParents]) :-
     def_class(ClassName, OtherParents),
 
     findall(Part,
-           is_part_of(Parent, Part),
+           is_member(Part, Parent),
            ParentParts),
-    add_part_to(ClassName, ParentParts).
+    add_part(ClassName, ParentParts).
 
 def_class(ClassName, [], []) :- def_class(ClassName, []), !.
 def_class(ClassName, Parents, Parts) :-
     def_class(ClassName, Parents),
-    add_part_to(ClassName, Parts).
+    add_part(ClassName, Parts).
 #+end_src
 
 *** Esempio pratico
@@ -49,8 +58,7 @@ make(InstanceName, ClassName, []) :-
     asserta(is_instance(InstanceName, ClassName)),
 
     findall([Name, Value, Type],
-           ((is_part_of(ClassName, field(Name, Value)), Type = nil);
-            is_part_of(ClassName, field(Name, Value, Type))),
+           is_member(field(Name, Value, Type), ClassName),
            Fields),
     set_default_fields_for(InstanceName, ClassName, Fields).
 
@@ -91,52 +99,62 @@ make(InstanceName, ClassName, [Field | Other]) :-
 #+begin_src prolog :tangle oop.pl
 :- dynamic is_class/1.
 :- dynamic is_child_of/2.
-:- dynamic is_part_of/2.
+:- dynamic is_member/2.
 :- dynamic is_instance/1.
 :- dynamic is_instance/2.
 #+end_src
 
-** add_part_to
+** add_part
 #+begin_src prolog :tangle oop.pl
-add_part_to(ClassName, []) :- is_class(ClassName), !.
-add_part_to(ClassName, [Part | OtherParts]) :-
-    field(Name, _Value) = Part,
+add_part(ClassName, []) :- is_class(ClassName), !.
+
+add_part(ClassName, [field(Name, Value) | OtherParts]) :-
+    is_class(ClassName),
+    is_member(field(Name, _, _), ClassName),
+    !,
+
+    %% Se è già definito questo member cancellalo
+    retractall(is_member(field(Name, _, _), ClassName)),
+
+    asserta(is_member((field(Name, Value, nil)), ClassName)),
+    add_part(ClassName, OtherParts).
+
+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).
+
+add_part(ClassName, [field(Name, Value, Type) | OtherParts]) :-
     is_class(ClassName),
-    (
-           (
-               is_part_of(ClassName, field(Name, _));
-               is_part_of(ClassName, field(Name, _, _))
-           ),
-           retractall(is_part_of(ClassName, field(Name, _))),
-           retractall(is_part_of(ClassName, field(Name, _, _)));
-           true()
-    ),
+    is_member(field(Name, _, _), ClassName),
     !,
-    asserta(is_part_of(ClassName, Part)),
-    add_part_to(ClassName, OtherParts).
 
-add_part_to(ClassName, [Part | OtherParts]) :-
-    field(Name, _Value, _Type) = Part,
+    %% Se è già definito questo member cancellalo
+    retractall(is_member(field(Name, _, _), ClassName)),
+
+    asserta(is_member(field(Name, Value, Type), ClassName)),
+    add_part(ClassName, OtherParts).
+
+add_part(ClassName, [field(Name, Value, Type) | OtherParts]) :-
     is_class(ClassName),
-    (
-           (
-               is_part_of(ClassName, field(Name, _));
-               is_part_of(ClassName, field(Name, _, _))
-           ),
-           retractall(is_part_of(ClassName, field(Name, _))),
-           retractall(is_part_of(ClassName, field(Name, _, _)));
-           true()
-    ),
+    \+ is_member(field(Name, _, _), ClassName),
     !,
-    asserta(is_part_of(ClassName, Part)),
-    add_part_to(ClassName, OtherParts).
 
-add_part_to(ClassName, [Part | OtherParts]) :-
-    method(_Name, ArgList, _Form) = Part,
+    %% Se è già definito questo member cancellalo
+    retractall(is_member(field(Name, _, _), ClassName)),
+
+    asserta(is_member(field(Name, Value, Type), ClassName)),
+    add_part(ClassName, OtherParts).
+
+add_part(ClassName, [method(Name, ArgList, Form) | OtherParts]) :-
     is_list(ArgList),
     is_class(ClassName),
-    asserta(is_part_of(ClassName, Part)),
-    add_part_to(ClassName, OtherParts).
+
+    asserta(is_member(method(Name, ArgList, Form), ClassName)),
+    add_part(ClassName, OtherParts).
 #+end_src
 
 ** set_default_fields_for
index 25396da1cba5e163f8606c60b0bf67e2ec2ca438..8923b593ed87eddf507fbc40dca607754de3e21c 100644 (file)
@@ -1,6 +1,15 @@
 %%%% <Cognome> <Nome> <Matricola>
 %%%% <eventuali collaborazioni>
 
+%% Ogni volta che viene valutato il file oop.pl pulisce
+%%     la base di conoscenza.
+%% Poi si leverà.
+:- abolish(is_class/1).
+:- abolish(is_child_of/2).
+:- abolish(is_member/2).
+:- abolish(is_instance/1).
+:- abolish(is_instance/2).
+
 def_class(ClassName, []) :- asserta(is_class(ClassName)), !.
 def_class(ClassName, [Parent | OtherParents]) :-
     is_class(Parent),
@@ -8,14 +17,14 @@ def_class(ClassName, [Parent | OtherParents]) :-
     def_class(ClassName, OtherParents),
 
     findall(Part,
-           is_part_of(Parent, Part),
+           is_member(Part, Parent),
            ParentParts),
-    add_part_to(ClassName, ParentParts).
+    add_part(ClassName, ParentParts).
 
 def_class(ClassName, [], []) :- def_class(ClassName, []), !.
 def_class(ClassName, Parents, Parts) :-
     def_class(ClassName, Parents),
-    add_part_to(ClassName, Parts).
+    add_part(ClassName, Parts).
 
 make(InstanceName, ClassName) :- make(InstanceName, ClassName, []).
 make(InstanceName, ClassName, []) :-
@@ -26,8 +35,7 @@ make(InstanceName, ClassName, []) :-
     asserta(is_instance(InstanceName, ClassName)),
 
     findall([Name, Value, Type],
-           ((is_part_of(ClassName, field(Name, Value)), Type = nil);
-            is_part_of(ClassName, field(Name, Value, Type))),
+           is_member(field(Name, Value, Type), ClassName),
            Fields),
     set_default_fields_for(InstanceName, ClassName, Fields).
 
@@ -43,49 +51,59 @@ make(InstanceName, ClassName, [Field | Other]) :-
 
 :- dynamic is_class/1.
 :- dynamic is_child_of/2.
-:- dynamic is_part_of/2.
+:- dynamic is_member/2.
 :- dynamic is_instance/1.
 :- dynamic is_instance/2.
 
-add_part_to(ClassName, []) :- is_class(ClassName), !.
-add_part_to(ClassName, [Part | OtherParts]) :-
-    field(Name, _Value) = Part,
+add_part(ClassName, []) :- is_class(ClassName), !.
+
+add_part(ClassName, [field(Name, Value) | OtherParts]) :-
+    is_class(ClassName),
+    is_member(field(Name, _, _), ClassName),
+    !,
+
+    %% Se è già definito questo member cancellalo
+    retractall(is_member(field(Name, _, _), ClassName)),
+
+    asserta(is_member((field(Name, Value, nil)), ClassName)),
+    add_part(ClassName, OtherParts).
+
+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).
+
+add_part(ClassName, [field(Name, Value, Type) | OtherParts]) :-
     is_class(ClassName),
-    (
-           (
-               is_part_of(ClassName, field(Name, _));
-               is_part_of(ClassName, field(Name, _, _))
-           ),
-           retractall(is_part_of(ClassName, field(Name, _))),
-           retractall(is_part_of(ClassName, field(Name, _, _)));
-           true()
-    ),
+    is_member(field(Name, _, _), ClassName),
     !,
-    asserta(is_part_of(ClassName, Part)),
-    add_part_to(ClassName, OtherParts).
 
-add_part_to(ClassName, [Part | OtherParts]) :-
-    field(Name, _Value, _Type) = Part,
+    %% Se è già definito questo member cancellalo
+    retractall(is_member(field(Name, _, _), ClassName)),
+
+    asserta(is_member(field(Name, Value, Type), ClassName)),
+    add_part(ClassName, OtherParts).
+
+add_part(ClassName, [field(Name, Value, Type) | OtherParts]) :-
     is_class(ClassName),
-    (
-           (
-               is_part_of(ClassName, field(Name, _));
-               is_part_of(ClassName, field(Name, _, _))
-           ),
-           retractall(is_part_of(ClassName, field(Name, _))),
-           retractall(is_part_of(ClassName, field(Name, _, _)));
-           true()
-    ),
+    \+ is_member(field(Name, _, _), ClassName),
     !,
-    asserta(is_part_of(ClassName, Part)),
-    add_part_to(ClassName, OtherParts).
 
-add_part_to(ClassName, [Part | OtherParts]) :-
-    method(_Name, ArgList, _Form) = Part,
+    %% Se è già definito questo member cancellalo
+    retractall(is_member(field(Name, _, _), ClassName)),
+
+    asserta(is_member(field(Name, Value, Type), ClassName)),
+    add_part(ClassName, OtherParts).
+
+add_part(ClassName, [method(Name, ArgList, Form) | OtherParts]) :-
     is_list(ArgList),
     is_class(ClassName),
-    asserta(is_part_of(ClassName, Part)),
-    add_part_to(ClassName, OtherParts).
+
+    asserta(is_member(method(Name, ArgList, Form), ClassName)),
+    add_part(ClassName, OtherParts).
 
 set_default_fields_for(_InstanceName, _ClassName, []) :- !.
 set_default_fields_for(InstanceName,