#+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),
*** 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
nonvar(ClassName),
!,
is_instance(InstanceName, ClassName).
-
-make(InstanceName, _ClassName) :-
- \+ number(InstanceName).
#+end_src
*** 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
*** 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
!.
fieldx(Instance, [FieldName | Others], Res) :-
is_instance(Instance),
- field(Instance, FieldName, Value),
+ field(Instance, FieldName, _Value),
fieldx(Instance, Others, Res).
#+end_src
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)),
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
** 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), !.
%%%% <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),
!,
is_instance(InstanceName, ClassName).
-make(InstanceName, _ClassName) :-
- \+ number(InstanceName).
-
make(InstanceName, ClassName, []) :-
atom(InstanceName),
nonvar(ClassName),
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,
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), !.