def_class(ClassName, []) :-
nonvar(ClassName),
+ \+ is_class(ClassName),
asserta(is_class(ClassName)),
!.
def_class(ClassName, [Parent | OtherParents]) :-
nonvar(ClassName),
nonvar(Parent),
nonvar(OtherParents),
+ \+ is_class(ClassName),
is_class(Parent),
asserta(is_child_of(Parent, ClassName)),
def_class(ClassName, OtherParents),
def_class(ClassName, [], []) :-
nonvar(ClassName),
+ \+ is_class(ClassName),
def_class(ClassName, []),
!.
def_class(ClassName, Parents, Parts) :-
nonvar(ClassName),
nonvar(Parents),
nonvar(Parts),
+ \+ is_class(ClassName),
def_class(ClassName, Parents),
add_part(ClassName, Parts).
#+end_src
*** Implementazione
#+begin_src prolog :tangle oop.pl
make(InstanceName, ClassName) :-
- nonvar(InstanceName),
+ atom(InstanceName),
nonvar(ClassName),
!,
make(InstanceName, ClassName, []).
+make(InstanceName, ClassName) :-
+ var(InstanceName),
+ nonvar(ClassName),
+ !,
+ is_instance(InstanceName, ClassName).
+
+make(InstanceName, _ClassName) :-
+ \+ number(InstanceName).
+#+end_src
+
+
+#+begin_src prolog :tangle oop.pl
make(InstanceName, ClassName, []) :-
- nonvar(InstanceName),
+ atom(InstanceName),
nonvar(ClassName),
is_class(ClassName),
\+ is_instance(InstanceName),
set_default_fields_for(InstanceName, ClassName, Fields).
make(InstanceName, ClassName, [Field | Other]) :-
- nonvar(InstanceName),
+ atom(InstanceName),
nonvar(ClassName),
[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),
- nonvar(ClassName),
- !,
- is_instance(InstanceName, ClassName).
make(InstanceName, ClassName, Fields) :-
var(InstanceName),
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
!,
fail().
#+end_src
+
+** check_fields
+#+begin_src prolog :tangle oop.pl
+check_fields(_InstanceName, []).
+check_fields(InstanceName, [=(Field, Value) | Other]) :-
+ field(InstanceName, Field, Value),
+ check_fields(InstanceName, Other).
+#+end_src
def_class(ClassName, []) :-
nonvar(ClassName),
+ \+ is_class(ClassName),
asserta(is_class(ClassName)),
!.
def_class(ClassName, [Parent | OtherParents]) :-
nonvar(ClassName),
nonvar(Parent),
nonvar(OtherParents),
+ \+ is_class(ClassName),
is_class(Parent),
asserta(is_child_of(Parent, ClassName)),
def_class(ClassName, OtherParents),
def_class(ClassName, [], []) :-
nonvar(ClassName),
+ \+ is_class(ClassName),
def_class(ClassName, []),
!.
def_class(ClassName, Parents, Parts) :-
nonvar(ClassName),
nonvar(Parents),
nonvar(Parts),
+ \+ is_class(ClassName),
def_class(ClassName, Parents),
add_part(ClassName, Parts).
make(InstanceName, ClassName) :-
- nonvar(InstanceName),
+ atom(InstanceName),
nonvar(ClassName),
!,
make(InstanceName, ClassName, []).
+make(InstanceName, ClassName) :-
+ var(InstanceName),
+ nonvar(ClassName),
+ !,
+ is_instance(InstanceName, ClassName).
+
+make(InstanceName, _ClassName) :-
+ \+ number(InstanceName).
+
make(InstanceName, ClassName, []) :-
- nonvar(InstanceName),
+ atom(InstanceName),
nonvar(ClassName),
is_class(ClassName),
\+ is_instance(InstanceName),
set_default_fields_for(InstanceName, ClassName, Fields).
make(InstanceName, ClassName, [Field | Other]) :-
- nonvar(InstanceName),
+ atom(InstanceName),
nonvar(ClassName),
[Field | Other] = Fields,
!,
make(InstanceName, ClassName, []),
set_fields_for(InstanceName, ClassName, Fields).
-make(InstanceName, ClassName) :-
- var(InstanceName),
- nonvar(ClassName),
- !,
- is_instance(InstanceName, ClassName).
-
make(InstanceName, ClassName, Fields) :-
var(InstanceName),
nonvar(ClassName),
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.
fieldx(Instance, [FieldName], Res) :-
retractall(field(InstanceName, _, _)),
!,
fail().
+
+check_fields(_InstanceName, []).
+check_fields(InstanceName, [=(Field, Value) | Other]) :-
+ field(InstanceName, Field, Value),
+ check_fields(InstanceName, Other).