From a0a60bbe60251457289ba3c9a8f7d5fc745a568f Mon Sep 17 00:00:00 2001 From: LeonardoBizzoni Date: Sun, 17 Dec 2023 09:07:05 +0100 Subject: [PATCH] =?utf8?q?Rimossa=20la=20disgiunzione=20perch=C3=A8=20ad?= =?utf8?q?=20Antoniotti=20sta=20sul=20cazzo?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit `is_part_of` mo si chiama `is_member` perchè era troppo lungo da scrivere. Se viene inserito un `field` formato da solo nome e valore, il suo tipo di defult è `nil` questo per evitare di scrivere più volte ogni funzione che usa la `findall` per trovare `field`. Antoniotti culo. --- Prolog/README.org | 94 ++++++++++++++++++++++++++++------------------- Prolog/oop.pl | 92 +++++++++++++++++++++++++++------------------- 2 files changed, 111 insertions(+), 75 deletions(-) diff --git a/Prolog/README.org b/Prolog/README.org index 84a7c4a..098b5d1 100644 --- a/Prolog/README.org +++ b/Prolog/README.org @@ -14,6 +14,15 @@ %%%% %%%% +%% Ogni volta che viene valutato il file oop.pl pulisce +%% la base di conoscenza. +%% Poi si leverà. +:- abolish(is_class/1). +:- abolish(is_child_of/2). +:- abolish(is_member/2). +:- abolish(is_instance/1). +:- abolish(is_instance/2). + def_class(ClassName, []) :- asserta(is_class(ClassName)), !. def_class(ClassName, [Parent | OtherParents]) :- is_class(Parent), @@ -21,14 +30,14 @@ def_class(ClassName, [Parent | OtherParents]) :- def_class(ClassName, OtherParents), findall(Part, - is_part_of(Parent, Part), + is_member(Part, Parent), ParentParts), - add_part_to(ClassName, ParentParts). + add_part(ClassName, ParentParts). def_class(ClassName, [], []) :- def_class(ClassName, []), !. def_class(ClassName, Parents, Parts) :- def_class(ClassName, Parents), - add_part_to(ClassName, Parts). + add_part(ClassName, Parts). #+end_src *** Esempio pratico @@ -49,8 +58,7 @@ make(InstanceName, ClassName, []) :- asserta(is_instance(InstanceName, ClassName)), findall([Name, Value, Type], - ((is_part_of(ClassName, field(Name, Value)), Type = nil); - is_part_of(ClassName, field(Name, Value, Type))), + is_member(field(Name, Value, Type), ClassName), Fields), set_default_fields_for(InstanceName, ClassName, Fields). @@ -91,52 +99,62 @@ make(InstanceName, ClassName, [Field | Other]) :- #+begin_src prolog :tangle oop.pl :- dynamic is_class/1. :- dynamic is_child_of/2. -:- dynamic is_part_of/2. +:- dynamic is_member/2. :- dynamic is_instance/1. :- dynamic is_instance/2. #+end_src -** add_part_to +** add_part #+begin_src prolog :tangle oop.pl -add_part_to(ClassName, []) :- is_class(ClassName), !. -add_part_to(ClassName, [Part | OtherParts]) :- - field(Name, _Value) = Part, +add_part(ClassName, []) :- is_class(ClassName), !. + +add_part(ClassName, [field(Name, Value) | OtherParts]) :- + is_class(ClassName), + is_member(field(Name, _, _), ClassName), + !, + + %% Se è già definito questo member cancellalo + retractall(is_member(field(Name, _, _), ClassName)), + + asserta(is_member((field(Name, Value, nil)), ClassName)), + add_part(ClassName, OtherParts). + +add_part(ClassName, [field(Name, Value) | OtherParts]) :- + is_class(ClassName), + \+ is_member(field(Name, _, _), ClassName), + !, + + asserta(is_member((field(Name, Value, nil)), ClassName)), + add_part(ClassName, OtherParts). + +add_part(ClassName, [field(Name, Value, Type) | OtherParts]) :- is_class(ClassName), - ( - ( - is_part_of(ClassName, field(Name, _)); - is_part_of(ClassName, field(Name, _, _)) - ), - retractall(is_part_of(ClassName, field(Name, _))), - retractall(is_part_of(ClassName, field(Name, _, _))); - true() - ), + is_member(field(Name, _, _), ClassName), !, - asserta(is_part_of(ClassName, Part)), - add_part_to(ClassName, OtherParts). -add_part_to(ClassName, [Part | OtherParts]) :- - field(Name, _Value, _Type) = Part, + %% Se è già definito questo member cancellalo + retractall(is_member(field(Name, _, _), ClassName)), + + asserta(is_member(field(Name, Value, Type), ClassName)), + add_part(ClassName, OtherParts). + +add_part(ClassName, [field(Name, Value, Type) | OtherParts]) :- is_class(ClassName), - ( - ( - is_part_of(ClassName, field(Name, _)); - is_part_of(ClassName, field(Name, _, _)) - ), - retractall(is_part_of(ClassName, field(Name, _))), - retractall(is_part_of(ClassName, field(Name, _, _))); - true() - ), + \+ is_member(field(Name, _, _), ClassName), !, - asserta(is_part_of(ClassName, Part)), - add_part_to(ClassName, OtherParts). -add_part_to(ClassName, [Part | OtherParts]) :- - method(_Name, ArgList, _Form) = Part, + %% Se è già definito questo member cancellalo + retractall(is_member(field(Name, _, _), ClassName)), + + asserta(is_member(field(Name, Value, Type), ClassName)), + add_part(ClassName, OtherParts). + +add_part(ClassName, [method(Name, ArgList, Form) | OtherParts]) :- is_list(ArgList), is_class(ClassName), - asserta(is_part_of(ClassName, Part)), - add_part_to(ClassName, OtherParts). + + asserta(is_member(method(Name, ArgList, Form), ClassName)), + add_part(ClassName, OtherParts). #+end_src ** set_default_fields_for diff --git a/Prolog/oop.pl b/Prolog/oop.pl index 25396da..8923b59 100644 --- a/Prolog/oop.pl +++ b/Prolog/oop.pl @@ -1,6 +1,15 @@ %%%% %%%% +%% Ogni volta che viene valutato il file oop.pl pulisce +%% la base di conoscenza. +%% Poi si leverà. +:- abolish(is_class/1). +:- abolish(is_child_of/2). +:- abolish(is_member/2). +:- abolish(is_instance/1). +:- abolish(is_instance/2). + def_class(ClassName, []) :- asserta(is_class(ClassName)), !. def_class(ClassName, [Parent | OtherParents]) :- is_class(Parent), @@ -8,14 +17,14 @@ def_class(ClassName, [Parent | OtherParents]) :- def_class(ClassName, OtherParents), findall(Part, - is_part_of(Parent, Part), + is_member(Part, Parent), ParentParts), - add_part_to(ClassName, ParentParts). + add_part(ClassName, ParentParts). def_class(ClassName, [], []) :- def_class(ClassName, []), !. def_class(ClassName, Parents, Parts) :- def_class(ClassName, Parents), - add_part_to(ClassName, Parts). + add_part(ClassName, Parts). make(InstanceName, ClassName) :- make(InstanceName, ClassName, []). make(InstanceName, ClassName, []) :- @@ -26,8 +35,7 @@ make(InstanceName, ClassName, []) :- asserta(is_instance(InstanceName, ClassName)), findall([Name, Value, Type], - ((is_part_of(ClassName, field(Name, Value)), Type = nil); - is_part_of(ClassName, field(Name, Value, Type))), + is_member(field(Name, Value, Type), ClassName), Fields), set_default_fields_for(InstanceName, ClassName, Fields). @@ -43,49 +51,59 @@ make(InstanceName, ClassName, [Field | Other]) :- :- dynamic is_class/1. :- dynamic is_child_of/2. -:- dynamic is_part_of/2. +:- dynamic is_member/2. :- dynamic is_instance/1. :- dynamic is_instance/2. -add_part_to(ClassName, []) :- is_class(ClassName), !. -add_part_to(ClassName, [Part | OtherParts]) :- - field(Name, _Value) = Part, +add_part(ClassName, []) :- is_class(ClassName), !. + +add_part(ClassName, [field(Name, Value) | OtherParts]) :- + is_class(ClassName), + is_member(field(Name, _, _), ClassName), + !, + + %% Se è già definito questo member cancellalo + retractall(is_member(field(Name, _, _), ClassName)), + + asserta(is_member((field(Name, Value, nil)), ClassName)), + add_part(ClassName, OtherParts). + +add_part(ClassName, [field(Name, Value) | OtherParts]) :- + is_class(ClassName), + \+ is_member(field(Name, _, _), ClassName), + !, + + asserta(is_member((field(Name, Value, nil)), ClassName)), + add_part(ClassName, OtherParts). + +add_part(ClassName, [field(Name, Value, Type) | OtherParts]) :- is_class(ClassName), - ( - ( - is_part_of(ClassName, field(Name, _)); - is_part_of(ClassName, field(Name, _, _)) - ), - retractall(is_part_of(ClassName, field(Name, _))), - retractall(is_part_of(ClassName, field(Name, _, _))); - true() - ), + is_member(field(Name, _, _), ClassName), !, - asserta(is_part_of(ClassName, Part)), - add_part_to(ClassName, OtherParts). -add_part_to(ClassName, [Part | OtherParts]) :- - field(Name, _Value, _Type) = Part, + %% Se è già definito questo member cancellalo + retractall(is_member(field(Name, _, _), ClassName)), + + asserta(is_member(field(Name, Value, Type), ClassName)), + add_part(ClassName, OtherParts). + +add_part(ClassName, [field(Name, Value, Type) | OtherParts]) :- is_class(ClassName), - ( - ( - is_part_of(ClassName, field(Name, _)); - is_part_of(ClassName, field(Name, _, _)) - ), - retractall(is_part_of(ClassName, field(Name, _))), - retractall(is_part_of(ClassName, field(Name, _, _))); - true() - ), + \+ is_member(field(Name, _, _), ClassName), !, - asserta(is_part_of(ClassName, Part)), - add_part_to(ClassName, OtherParts). -add_part_to(ClassName, [Part | OtherParts]) :- - method(_Name, ArgList, _Form) = Part, + %% Se è già definito questo member cancellalo + retractall(is_member(field(Name, _, _), ClassName)), + + asserta(is_member(field(Name, Value, Type), ClassName)), + add_part(ClassName, OtherParts). + +add_part(ClassName, [method(Name, ArgList, Form) | OtherParts]) :- is_list(ArgList), is_class(ClassName), - asserta(is_part_of(ClassName, Part)), - add_part_to(ClassName, OtherParts). + + asserta(is_member(method(Name, ArgList, Form), ClassName)), + add_part(ClassName, OtherParts). set_default_fields_for(_InstanceName, _ClassName, []) :- !. set_default_fields_for(InstanceName, -- 2.52.0