:- abolish(is_member/2).
:- abolish(is_instance/1).
:- abolish(is_instance/2).
+:- abolish(field/3).
def_class(ClassName, []) :- asserta(is_class(ClassName)), !.
def_class(ClassName, [Parent | OtherParents]) :-
*** Implementazione
#+begin_src prolog :tangle oop.pl
-make(InstanceName, ClassName) :- make(InstanceName, ClassName, []).
+make(InstanceName, ClassName) :-
+ nonvar(InstanceName),
+ !,
+ make(InstanceName, ClassName, []).
+
make(InstanceName, ClassName, []) :-
+ nonvar(InstanceName),
is_class(ClassName),
\+ is_instance(InstanceName),
!,
set_default_fields_for(InstanceName, ClassName, Fields).
make(InstanceName, ClassName, [Field | Other]) :-
+ nonvar(InstanceName),
[Field | Other] = Fields,
!,
make(InstanceName, ClassName, []),
set_fields_for(InstanceName, ClassName, Fields).
#+end_src
+
+#+begin_src prolog :tangle oop.pl
+make(InstanceName, ClassName) :-
+ var(InstanceName),
+ !,
+ is_instance(InstanceName, ClassName).
+
+make(InstanceName, ClassName, Fields) :-
+ var(InstanceName),
+ is_list(Fields),
+ Fields \= [],
+ is_instance(InstanceName, ClassName),
+ check_fields(InstanceName, Fields).
+
+check_fields(InstanceName, []).
+check_fields(InstanceName, [=(Field, Value) | Other]) :-
+ field(InstanceName, Field, Value),
+ check_fields(InstanceName, Other).
+#+end_src
+
*** Esempio pratico
:- abolish(is_member/2).
:- abolish(is_instance/1).
:- abolish(is_instance/2).
+:- abolish(field/3).
def_class(ClassName, []) :- asserta(is_class(ClassName)), !.
def_class(ClassName, [Parent | OtherParents]) :-
def_class(ClassName, Parents),
add_part(ClassName, Parts).
-make(InstanceName, ClassName) :- make(InstanceName, ClassName, []).
+make(InstanceName, ClassName) :-
+ nonvar(InstanceName),
+ !,
+ make(InstanceName, ClassName, []).
+
make(InstanceName, ClassName, []) :-
+ nonvar(InstanceName),
is_class(ClassName),
\+ is_instance(InstanceName),
!,
set_default_fields_for(InstanceName, ClassName, Fields).
make(InstanceName, ClassName, [Field | Other]) :-
+ nonvar(InstanceName),
[Field | Other] = Fields,
!,
make(InstanceName, ClassName, []),
set_fields_for(InstanceName, ClassName, Fields).
+make(InstanceName, ClassName) :-
+ var(InstanceName),
+ !,
+ is_instance(InstanceName, ClassName).
+
+make(InstanceName, ClassName, Fields) :-
+ var(InstanceName),
+ is_list(Fields),
+ Fields \= [],
+ is_instance(InstanceName, ClassName),
+ check_fields(InstanceName, Fields).
+
+check_fields(InstanceName, []).
+check_fields(InstanceName, [=(Field, Value) | Other]) :-
+ field(InstanceName, Field, Value),
+ check_fields(InstanceName, Other).
+
:- dynamic field/3.