%%%% <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),
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
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).
#+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
%%%% <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),
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, []) :-
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).
:- 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,