From e0d797f5774a65ea4b081ad2fad3d4331799e8c3 Mon Sep 17 00:00:00 2001 From: LeonardoBizzoni Date: Sun, 17 Dec 2023 17:45:43 +0100 Subject: [PATCH] Fixato ridefinizione di class con lo stesso nome, inizio caso 3 make --- Prolog/README.org | 44 +++++++++++++++++++++++++++----------------- Prolog/oop.pl | 35 +++++++++++++++++++++-------------- 2 files changed, 48 insertions(+), 31 deletions(-) diff --git a/Prolog/README.org b/Prolog/README.org index e9d4925..80fbc93 100644 --- a/Prolog/README.org +++ b/Prolog/README.org @@ -26,12 +26,14 @@ 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 diff --git a/Prolog/oop.pl b/Prolog/oop.pl index 452d766..b6f6d4f 100644 --- a/Prolog/oop.pl +++ b/Prolog/oop.pl @@ -13,12 +13,14 @@ 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). -- 2.52.0