From d9af815e008560792e6aed2bddc34b3b8b730a7f Mon Sep 17 00:00:00 2001 From: LeonardoBizzoni Date: Sun, 17 Dec 2023 09:57:20 +0100 Subject: [PATCH] Fatto il caso `make(Var, classe)` --- Prolog/README.org | 29 ++++++++++++++++++++++++++++- Prolog/oop.pl | 26 +++++++++++++++++++++++++- 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/Prolog/README.org b/Prolog/README.org index 098b5d1..49a1666 100644 --- a/Prolog/README.org +++ b/Prolog/README.org @@ -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 diff --git a/Prolog/oop.pl b/Prolog/oop.pl index 8923b59..d360f96 100644 --- a/Prolog/oop.pl +++ b/Prolog/oop.pl @@ -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. -- 2.52.0