]> git.leonardobizzoni.com Git - ObjectOriented-Prolog-Lisp/commitdiff
Fixato ridefinizione di class con lo stesso nome, inizio caso 3 make
authorLeonardoBizzoni <leo2002714@gmail.com>
Sun, 17 Dec 2023 16:45:43 +0000 (17:45 +0100)
committerLeonardoBizzoni <leo2002714@gmail.com>
Sun, 17 Dec 2023 16:45:43 +0000 (17:45 +0100)
Prolog/README.org
Prolog/oop.pl

index e9d4925602c6653c82bb48f02ce3864f58b8e5c0..80fbc930aa98e308f06db9eee18eb9fc19c7d4e2 100644 (file)
 
 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),
@@ -43,12 +45,14 @@ def_class(ClassName, [Parent | 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
@@ -63,13 +67,25 @@ def_class(ClassName, Parents, Parts) :-
 *** 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),
@@ -83,21 +99,12 @@ make(InstanceName, ClassName, []) :-
     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),
@@ -106,11 +113,6 @@ make(InstanceName, ClassName, 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
@@ -242,3 +244,11 @@ set_fields_for(InstanceName, _ClassName, _Fields) :-
     !,
     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
index 452d7668476132e789f1faff0a8c04f94d13ad69..b6f6d4f7dd32781a4226a4576e3d9baaa395064a 100644 (file)
 
 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),
@@ -30,23 +32,34 @@ def_class(ClassName, [Parent | 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),
@@ -60,19 +73,13 @@ make(InstanceName, ClassName, []) :-
     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),
@@ -81,11 +88,6 @@ make(InstanceName, ClassName, 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.
 
 fieldx(Instance, [FieldName], Res) :-
@@ -178,3 +180,8 @@ set_fields_for(InstanceName, _ClassName, _Fields) :-
     retractall(field(InstanceName, _, _)),
     !,
     fail().
+
+check_fields(_InstanceName, []).
+check_fields(InstanceName, [=(Field, Value) | Other]) :-
+    field(InstanceName, Field, Value),
+    check_fields(InstanceName, Other).