]> git.leonardobizzoni.com Git - ObjectOriented-Prolog-Lisp/commitdiff
Nuovo predicato replace e rimossi i predicat edit_body,list_to_conjunction e conjunct...
authorkier-mirko <mirkotolentino1@gmail.com>
Sun, 24 Dec 2023 11:58:26 +0000 (12:58 +0100)
committerkier-mirko <mirkotolentino1@gmail.com>
Sun, 24 Dec 2023 11:58:26 +0000 (12:58 +0100)
Prolog/README.org
Prolog/oop.pl

index 8b707bf5365b1758e609dabdf63a924bc827d710..2d612d65b29e6947f28046d72bbf795c63368186 100644 (file)
@@ -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
index d2f3ba41062d51602e381a708322166a48e95331..bf01fdcbf26179afbd752b39f5a87460eee17a5a 100644 (file)
@@ -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), !.