From 6c101ac53a775646427e66ae7610683cafc59f0d Mon Sep 17 00:00:00 2001 From: LeonardoBizzoni Date: Sun, 24 Dec 2023 16:05:02 +0100 Subject: [PATCH] Fixata indentazione e `check_value_type` + aggiunto esempio albero --- Prolog/README.org | 130 +++++++++++++++++++++++++++++++++------------- Prolog/oop.pl | 87 +++++++++++++------------------ 2 files changed, 131 insertions(+), 86 deletions(-) diff --git a/Prolog/README.org b/Prolog/README.org index 0aeead1..fe93276 100644 --- a/Prolog/README.org +++ b/Prolog/README.org @@ -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 @@ -14,16 +16,6 @@ %%%% %%%% -%% 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), !. diff --git a/Prolog/oop.pl b/Prolog/oop.pl index 0c98b7e..985e975 100644 --- a/Prolog/oop.pl +++ b/Prolog/oop.pl @@ -1,16 +1,6 @@ %%%% %%%% -%% 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), !. -- 2.52.0