%%%% <Cognome> <Nome> <Matricola>
%%%% <eventuali collaborazioni>
-writeln(user_output, "Incredibile definizione del predicato `def_class`").
+def_class(ClassName, []) :- asserta(is_class(ClassName)), !.
+def_class(ClassName, [Parent | OtherParents]) :-
+ is_class(Parent),
+ asserta(is_child_of(Parent, ClassName)),
+ def_class(ClassName, OtherParents).
+
+def_class(ClassName, [], []) :- def_class(ClassName, []), !.
+def_class(ClassName, Parents, Parts) :-
+ def_class(ClassName, Parents),
+ add_part_to(ClassName, Parts).
#+end_src
*** Esempio pratico
*** Implementazione
#+begin_src prolog :tangle oop.pl
-writeln(user_output, "Incredibile definizione del predicato `make`").
#+end_src
*** Esempio pratico
*** Implementazione
#+begin_src prolog :tangle oop.pl
-writeln(user_output, "Incredibile definizione del predicato `field`").
#+end_src
*** Esempio pratico
*** Implementazione
#+begin_src prolog :tangle oop.pl
-writeln(user_output, "Incredibile definizione del predicato `fields`").
#+end_src
*** Esempio pratico
* Predicati helper
+** Predicati dinamici
+#+begin_src prolog :tangle oop.pl
+:- dynamic is_class/1.
+:- dynamic is_child_of/2.
+:- dynamic is_part_of/2.
+#+end_src
+
+** add_part_to
+#+begin_src prolog :tangle oop.pl
+add_part_to(ClassName, []) :- is_class(ClassName), !.
+add_part_to(ClassName, [Part | OtherParts]) :-
+ field(_Name, _Value) = Part,
+ !,
+ is_class(ClassName),
+ asserta(is_part_of(ClassName, Part)),
+ add_part_to(ClassName, OtherParts).
+
+add_part_to(ClassName, [Part | OtherParts]) :-
+ field(_Name, _Value, _Type) = Part,
+ !,
+ is_class(ClassName),
+ asserta(is_part_of(ClassName, Part)),
+ add_part_to(ClassName, OtherParts).
+
+add_part_to(ClassName, [Part | OtherParts]) :-
+ method(_Name, ArgList, _Form) = Part,
+ is_list(ArgList),
+ !,
+ is_class(ClassName),
+ asserta(is_part_of(ClassName, Part)),
+ add_part_to(ClassName, OtherParts).
+#+end_src
%%%% <Cognome> <Nome> <Matricola>
%%%% <eventuali collaborazioni>
-writeln(user_output, "Incredibile definizione del predicato `def_class`").
+def_class(ClassName, []) :- asserta(is_class(ClassName)), !.
+def_class(ClassName, [Parent | OtherParents]) :-
+ is_class(Parent),
+ asserta(is_child_of(Parent, ClassName)),
+ def_class(ClassName, OtherParents).
-writeln(user_output, "Incredibile definizione del predicato `make`").
+def_class(ClassName, [], []) :- def_class(ClassName, []), !.
+def_class(ClassName, Parents, Parts) :-
+ def_class(ClassName, Parents),
+ add_part_to(ClassName, Parts).
-writeln(user_output, "Incredibile definizione del predicato `field`").
-writeln(user_output, "Incredibile definizione del predicato `fields`").
+
+
+
+
+
+:- dynamic is_class/1.
+:- dynamic is_child_of/2.
+:- dynamic is_part_of/2.
+
+add_part_to(ClassName, []) :- is_class(ClassName), !.
+add_part_to(ClassName, [Part | OtherParts]) :-
+ field(_Name, _Value) = Part,
+ !,
+ is_class(ClassName),
+ asserta(is_part_of(ClassName, Part)),
+ add_part_to(ClassName, OtherParts).
+
+add_part_to(ClassName, [Part | OtherParts]) :-
+ field(_Name, _Value, _Type) = Part,
+ !,
+ is_class(ClassName),
+ asserta(is_part_of(ClassName, Part)),
+ add_part_to(ClassName, OtherParts).
+
+add_part_to(ClassName, [Part | OtherParts]) :-
+ method(_Name, ArgList, _Form) = Part,
+ is_list(ArgList),
+ !,
+ is_class(ClassName),
+ asserta(is_part_of(ClassName, Part)),
+ add_part_to(ClassName, OtherParts).