]> git.leonardobizzoni.com Git - ObjectOriented-Prolog-Lisp/commitdiff
Fixata indentazione e `check_value_type` + aggiunto esempio albero
authorLeonardoBizzoni <leo2002714@gmail.com>
Sun, 24 Dec 2023 15:05:02 +0000 (16:05 +0100)
committerLeonardoBizzoni <leo2002714@gmail.com>
Sun, 24 Dec 2023 15:05:02 +0000 (16:05 +0100)
Prolog/README.org
Prolog/oop.pl

index 0aeead12391bf0771d582bc9fb5d0a2f407965a2..fe932768f090a92458673b09ebb10e48e1f64fe2 100644 (file)
@@ -1,5 +1,7 @@
 #+title: ðŸ’€ OOΠ in Prolog ðŸ’€
-#+author: Bizzoni Leonardo (899629), Barone Matteo(894594), Kier Mirko Tolentino(899728)
+#+author: Bizzoni Leonardo (899629),
+#+author: Kier Mirko Tolentino(899728),
+#+author: Barone Matteo(894594)
 
 * Breve descrizione
 42
 %%%% <Cognome> <Nome> <Matricola>
 %%%% <eventuali collaborazioni>
 
-%% 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).
-:- abolish(field/3).
-
 def_class(ClassName, []) :-
     nonvar(ClassName),
     \+ is_class(ClassName),
@@ -60,19 +52,80 @@ def_class(ClassName, Parents, Parts) :-
 *** Esempio pratico
 #+name: def_class
 #+begin_src prolog
-def_class(foo, [], [field(foo, 42), method(foo, [Number], (field(this, foo, Foo),
-                                                            Sum is Number + Foo,
-                                                            write("Sum: "), writeln(Sum)))]).
-
-def_class(bar, [], [field(bar, "42"), method(bar, [], (write("Favorite number is "),
-                                                        field(this, bar, Bar),
-                                                        writeln(Bar)))]).
-
-def_class(foobar, [foo, bar], [field(foobar, "Baz"), method(foobar, [X, X, [X]], (!)), method(foobar, [Start, End, [Start | Ls]], (Start =< End,
-                                                                                                                                    N is Start + 1,
-                                                                                                                                    foobar(this, N, End, Ls)))]).
-
+def_class(foo, [], [field(foo, 42),
+                   method(foo, [Number], (field(this, foo, Foo),
+                                          Sum is Number + Foo,
+                                          write("Sum: "), writeln(Sum)))]).
+
+def_class(bar, [], [field(bar, "42"),
+                   method(bar, [], (write("Favorite number is "),
+                                    field(this, bar, Bar),
+                                    writeln(Bar)))]).
+
+def_class(foobar, [foo, bar], [field(foobar, "Baz"),
+                              method(foobar, [X, X, [X]], (!)),
+                              method(foobar, [Start, End, [Start | Ls]],
+                                     (Start =< End,
+                                      N is Start + 1,
+                                      foobar(this, N, End, Ls)))]).
+
+def_class(node, [], [field(value, 0, integer),
+                    field(left,nil,node),
+                    field(right,nil,node),
+                    method(print, [],
+                           (write("Value: "),
+                            field(this, value, Val),
+                            writeln(Val),
+                            Tabs = 5,
+                            field(this, left, L), (
+                                L \= nil, print(L, Tabs);
+                                tab(Tabs), writeln("Left: nil")),
+                            field(this, right, R), (
+                                R \= nil, print(R, Tabs);
+                                tab(Tabs), writeln("Right: nil")))),
+                    method(print, [Tabs],
+                           (tab(Tabs),write("Value: "),
+                            field(this, value, Val),
+                            writeln(Val),
+                            NewTabs is Tabs + 5,
+                            field(this,left,L), (
+                                L \= nil, print(L, NewTabs);
+                                tab(NewTabs), writeln("Left: nil")),
+                            field(this,right,R),(
+                                R \= nil, print(R, NewTabs);
+                                tab(NewTabs), writeln("Right: nil")))),
+                    method(insert, [Key, NewVal],
+                           (field(this, value, OldVal), NewVal = OldVal, !)),
+                    method(insert, [Key, NewVal],
+                           (field(this, value, OldVal),
+                            NewVal > OldVal,
+                            field(this, right, nil),
+                            !,
+                            make(Key, node, [value=NewVal]),
+                            asserta(field(this, right, Key)))),
+                    method(insert, [Key, NewVal],
+                           (field(this, value, OldVal),
+                            NewVal > OldVal,
+                            field(this, right, R),
+                            R \= nil,
+                            !,
+                            insert(R, Key, NewVal))),
+                    method(insert, [Key, NewVal],
+                           (field(this, value, OldVal),
+                            NewVal < OldVal,
+                            field(this, left, nil),
+                            !,
+                            make(Key, node, [value=NewVal]),
+                            asserta(field(this, left, Key)))),
+                    method(insert, [Key, NewVal],
+                           (field(this, value, OldVal),
+                            NewVal < OldVal,
+                            field(this, left, L),
+                            L \= nil,
+                            !,
+                            insert(L, Key, NewVal)))]).
 #+end_src
+
 ** make
 *** Definizione
 
@@ -90,9 +143,6 @@ make(InstanceName, ClassName) :-
     nonvar(ClassName),
     !,
     is_instance(InstanceName, ClassName).
-
-make(InstanceName, _ClassName) :-
-    \+ number(InstanceName).
 #+end_src
 
 
@@ -130,11 +180,14 @@ make(InstanceName, ClassName, Fields) :-
 
 *** Esempio pratico
 #+begin_src prolog
-make(f, foo).
-make(b, bar, [bar = "69"]).
-make(fb, foobar, [foo = 69, bar = "69"]).
-make(Instance, foobar).
-make(Instance, bar, [bar = "69"]).
+make(f, foo).                                     %% true.
+make(b, bar, [bar = "69"]).                       %% true.
+make(fb, foobar, [foo = 42, bar = "The answer"]). %% true.
+make(root, node, [value = 200, left = fb]).       %% false.
+make(root, node, [value = 200]).                  %% true.
+
+make(Instance, foobar).            %% Instance = fb.
+make(Instance, bar, [bar = "69"]). %% Instance = b; false.
 #+end_src
 
 
@@ -149,9 +202,13 @@ make(Instance, bar, [bar = "69"]).
 
 *** Esempio pratico
 #+begin_src prolog
-field(fb, foobar, foo).
-field(fb, foobar, foobar).
+field(fb, foo, X).            %% X = 42; false.
+field(fb, bar, "The answer"). %% true.
+
+field(root, value, 3.141592653589793). %% false.
+field(root, value, X).                 %% X = 200
 #+end_src
+
 ** fieldx
 *** Definizione
 - Non ho capito se così va bene
@@ -165,7 +222,7 @@ fieldx(Instance, [FieldName], Res) :-
     !.
 fieldx(Instance, [FieldName | Others], Res) :-
     is_instance(Instance),
-    field(Instance, FieldName, Value),
+    field(Instance, FieldName, _Value),
     fieldx(Instance, Others, Res).
 #+end_src
 
@@ -193,7 +250,7 @@ add_part(ClassName, [field(Name, Value) | OtherParts]) :-
       is_member(field(Name, _, _), ClassName),
       !,
 
-      %% Se Ã¨ già definito questo member cancellalo
+      %% Se Ã¨ già definito questo member viene cancellalo
       retractall(is_member(field(Name, _, _), ClassName)),
 
       asserta(is_member((field(Name, Value, nil)), ClassName)),
@@ -240,7 +297,7 @@ add_part(ClassName, [method(Name, ArgList, Body) | OtherParts]) :-
       Head =.. [Name, InstanceName | ArgList],
       !,
       replace(this,InstanceName,Body,NewBody),
-      asserta(Head :- (is_instance(InstanceName, ClassName), NewBody),
+      asserta(Head :- (is_instance(InstanceName, ClassName), NewBody, !)),
       add_part(ClassName, OtherParts).
 #+end_src
 
@@ -305,6 +362,7 @@ replace(Subterm0, Subterm, Term0, Term) :-
 
 ** check_value_type
 #+begin_src prolog :tangle oop.pl
+check_value_type(_X, nil) :- !.
 check_value_type(nil, _X) :- !.
 check_value_type(var, X) :- var(X), !.
 check_value_type(nonvar, X) :- nonvar(X), !.
index 0c98b7e0f8a3db74fe03449f13b21a17486322e9..985e97571e79861a2d007906138ca7433b47a1f3 100644 (file)
@@ -1,16 +1,6 @@
 %%%% <Cognome> <Nome> <Matricola>
 %%%% <eventuali collaborazioni>
 
-%% 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).
-:- abolish(field/3).
-
 def_class(ClassName, []) :-
     nonvar(ClassName),
     \+ is_class(ClassName),
@@ -55,9 +45,6 @@ make(InstanceName, ClassName) :-
     !,
     is_instance(InstanceName, ClassName).
 
-make(InstanceName, _ClassName) :-
-    \+ number(InstanceName).
-
 make(InstanceName, ClassName, []) :-
     atom(InstanceName),
     nonvar(ClassName),
@@ -107,60 +94,59 @@ fieldx(Instance, [FieldName | Others], Res) :-
 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 viene 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),
-
-    asserta(is_member(method(Name, ArgList, Body), ClassName)),
+      is_list(ArgList),
+      is_class(ClassName),
 
-    Head =.. [Name, InstanceName | ArgList],
-    !,
-    replace(this,InstanceName,Body,NewBody),
-    asserta(Head :- (is_instance(InstanceName, ClassName), NewBody)),
+      asserta(is_member(method(Name, ArgList, Body), ClassName)),
 
-    add_part(ClassName, OtherParts).
+      Head =.. [Name, InstanceName | ArgList],
+      !,
+      replace(this,InstanceName,Body,NewBody),
+      asserta(Head :- (is_instance(InstanceName, ClassName), NewBody, !)),
+      add_part(ClassName, OtherParts).
 
 set_default_fields_for(_InstanceName, _ClassName, []) :- !.
 set_default_fields_for(InstanceName,
@@ -209,6 +195,7 @@ replace(Subterm0, Subterm, Term0, Term) :-
        maplist(replace(Subterm0,Subterm), Args0, Args),
        Term =.. [F | Args].
 
+check_value_type(_X, nil) :- !.
 check_value_type(nil, _X) :- !.
 check_value_type(var, X) :- var(X), !.
 check_value_type(nonvar, X) :- nonvar(X), !.