]> git.leonardobizzoni.com Git - ObjectOriented-Prolog-Lisp/commitdiff
Fatto il caso `make(Var, classe)`
authorLeonardoBizzoni <leo2002714@gmail.com>
Sun, 17 Dec 2023 08:57:20 +0000 (09:57 +0100)
committerLeonardoBizzoni <leo2002714@gmail.com>
Sun, 17 Dec 2023 08:57:20 +0000 (09:57 +0100)
Prolog/README.org
Prolog/oop.pl

index 098b5d1e5e595687d4e3d7d3a4d4487288bf639f..49a1666f3773f7255f87340c343d36d8e2208096 100644 (file)
@@ -22,6 +22,7 @@
 :- 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]) :-
@@ -49,8 +50,13 @@ def_class(ClassName, Parents, Parts) :-
 
 *** 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),
     !,
@@ -63,12 +69,33 @@ make(InstanceName, ClassName, []) :-
     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
 
 
index 8923b593ed87eddf507fbc40dca607754de3e21c..d360f9697c60c9d9a9784eef47315edf58f490cc 100644 (file)
@@ -9,6 +9,7 @@
 :- 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]) :-
@@ -26,8 +27,13 @@ def_class(ClassName, Parents, Parts) :-
     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),
     !,
@@ -40,11 +46,29 @@ make(InstanceName, ClassName, []) :-
     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.