From 7a37ad5273dd5a2ab6c574a245c729f3b5eb9f80 Mon Sep 17 00:00:00 2001 From: kier-mirko Date: Sun, 24 Dec 2023 12:58:26 +0100 Subject: [PATCH] Nuovo predicato replace e rimossi i predicat edit_body,list_to_conjunction e conjunction_to_list --- Prolog/README.org | 106 +++++++++++++++++++--------------------------- Prolog/oop.pl | 29 ++++--------- 2 files changed, 53 insertions(+), 82 deletions(-) diff --git a/Prolog/README.org b/Prolog/README.org index 8b707bf..2d612d6 100644 --- a/Prolog/README.org +++ b/Prolog/README.org @@ -189,60 +189,60 @@ fieldx(fb, [foo,bar,foobar], Result). add_part(ClassName, []) :- is_class(ClassName), !. add_part(ClassName, [field(Name, Value) | OtherParts]) :- - is_class(ClassName), - is_member(field(Name, _, _), ClassName), - !, + is_class(ClassName), + is_member(field(Name, _, _), ClassName), + !, - %% Se è già definito questo member cancellalo - retractall(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). + 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), - !, + is_class(ClassName), + \+ is_member(field(Name, _, _), ClassName), + !, - asserta(is_member((field(Name, Value, nil)), ClassName)), - add_part(ClassName, OtherParts). + asserta(is_member((field(Name, Value, nil)), ClassName)), + add_part(ClassName, OtherParts). add_part(ClassName, [field(Name, Value, Type) | OtherParts]) :- - is_class(ClassName), - is_member(field(Name, _, _), ClassName), - !, + is_class(ClassName), + is_member(field(Name, _, _), ClassName), + !, - %% Se è già definito questo member cancellalo - retractall(is_member(field(Name, _, _), ClassName)), + %% Se è già definito questo member cancellalo + retractall(is_member(field(Name, _, _), ClassName)), - check_value_type(Type, Value), - asserta(is_member(field(Name, Value, Type), ClassName)), - add_part(ClassName, OtherParts). + check_value_type(Type, Value), + asserta(is_member(field(Name, Value, Type), ClassName)), + add_part(ClassName, OtherParts). add_part(ClassName, [field(Name, Value, Type) | OtherParts]) :- - is_class(ClassName), - \+ is_member(field(Name, _, _), ClassName), - !, + is_class(ClassName), + \+ is_member(field(Name, _, _), ClassName), + !, - %% Se è già definito questo member cancellalo - retractall(is_member(field(Name, _, _), ClassName)), + %% Se è già definito questo member cancellalo + retractall(is_member(field(Name, _, _), ClassName)), - check_value_type(Type, Value), - asserta(is_member(field(Name, Value, Type), ClassName)), - add_part(ClassName, OtherParts). + check_value_type(Type, Value), + asserta(is_member(field(Name, Value, Type), ClassName)), + add_part(ClassName, OtherParts). add_part(ClassName, [method(Name, ArgList, Body) | OtherParts]) :- - is_list(ArgList), - is_class(ClassName), + is_list(ArgList), + is_class(ClassName), - asserta(is_member(method(Name, ArgList, Body), ClassName)), + asserta(is_member(method(Name, ArgList, Body), ClassName)), - Head =.. [Name, InstanceName | ArgList], - !, - edit_body(InstanceName, Body, NewBody), - asserta(Head :- (call_method(InstanceName, ClassName, NewBody))), + Head =.. [Name, InstanceName | ArgList], + !, + replace(this,InstanceName,Body,NewBody), + asserta(Head :- (call_method(InstanceName, ClassName, NewBody))), - add_part(ClassName, OtherParts). + add_part(ClassName, OtherParts). #+end_src ** set_default_fields_for @@ -297,34 +297,16 @@ call_method(Instance, ClassName, Body) :- retractall(is_instance(this, ClassName)))). #+end_src -** edit_body -#+begin_src prolog -edit_body(InstanceName, OldBody, NewBody) :- - conjunction_to_list(OldBody, BodyList), - replace(field(this, Name, Value), field(InstanceName, Name, Value), BodyList, Result), - list_to_conjunction(Result, NewBody). - #+end_src - -** conjunction_to_list -#+begin_src prolog -conjunction_to_list(Body, [P | Ps]) :- - Body = (P, Conjuncts), - !, - conjunction_to_list(Conjuncts, Ps). -conjunction_to_list(Predicate, [Predicate]) :- !. -#+end_src - -** list_to_conjunction -#+begin_src prolog -list_to_conjunction([], true). -list_to_conjunction([P|Ps], (P, Conjuncts)) :- list_to_conjunction(Ps, Conjuncts). -#+end_src - ** replace #+begin_src prolog -replace(_, _, [], []) :- !. -replace(Old, New, [Old | L1], [New | L2]) :- !, replace(Old, New, L1, L2). -replace(Old, New, [E | L1], [E | L2]) :- E \= Old, !, replace(Old, New, L1, L2). +replace(Subterm0, Subterm, Term0, Term) :- + ( Term0 == Subterm0 -> Term = Subterm + ; var(Term0) -> Term = Term0 + ; Term0 =.. [F|Args0], + maplist(replace(Subterm0,Subterm), Args0, Args), + Term =.. [F|Args] + ). + #+end_src ** check_value_type diff --git a/Prolog/oop.pl b/Prolog/oop.pl index d2f3ba4..bf01fdc 100644 --- a/Prolog/oop.pl +++ b/Prolog/oop.pl @@ -157,8 +157,8 @@ add_part(ClassName, [method(Name, ArgList, Body) | OtherParts]) :- Head =.. [Name, InstanceName | ArgList], !, - edit_body(InstanceName, Body, NewBody), - asserta(Head :- (call_method(InstanceName, ClassName, NewBody))), + replace(this,InstanceName,Body,NewBody), + asserta(Head :- (call_method(InstanceName,ClassName,NewBody))), add_part(ClassName, OtherParts). @@ -202,24 +202,13 @@ call_method(Instance, ClassName, Body) :- call_cleanup(call(Body), ( retractall(is_instance(this, ClassName)))). -edit_body(InstanceName, OldBody, NewBody) :- - conjunction_to_list(OldBody, BodyList), - replace(field(this, Name, Value), field(InstanceName, Name, Value), BodyList, Result), - list_to_conjunction(Result, NewBody). - -conjunction_to_list(Body, [P | Ps]) :- - Body = (P, Conjuncts), - !, - conjunction_to_list(Conjuncts, Ps). -conjunction_to_list(Predicate, [Predicate]) :- !. - -list_to_conjunction([], true). -list_to_conjunction([P|Ps], (P, Conjuncts)) :- list_to_conjunction(Ps, Conjuncts). - -replace(_, _, [], []) :- !. -replace(Old, New, [Old | L1], [New | L2]) :- !, replace(Old, New, L1, L2). -replace(Old, New, [E | L1], [E | L2]) :- E \= Old, !, replace(Old, New, L1, L2). - +replace(Subterm0, Subterm, Term0, Term) :- + ( Term0 == Subterm0 -> Term = Subterm + ; var(Term0) -> Term = Term0 + ; Term0 =.. [F|Args0], + maplist(replace(Subterm0,Subterm), Args0, Args), + Term =.. [F|Args] + ). check_value_type(nil, _X) :- !. check_value_type(var, X) :- var(X), !. -- 2.52.0